首页 > 解决方案 > NSubstitute ForPartsOf 模拟除一个之外的所有方法?

问题描述

使用 NSubstitute,可以仅使用Substitute.ForPartsOf<T>(). 但这将默认调用真正的方法,除非您专门配置要模拟的方法,例如mySubstitute.Configure().MyMethod().Returns(/*whatever*/).

我想做相反的事情:创建一个默认模拟所有方法的替代品,然后指定一个特定的方法来进行真正的调用。

有没有一种干净的方法可以做到这一点?

我能想出的最好方法是(未经测试):

MyClass realObj = new MyClass();
var subst = Substitute.For<MyClass>();
subst.MyMethod().Returns(realObj.MyMethod());

我想我正在寻找这样做的捷径:

var subst = Substitute.ForPartsOf<MyClass>();
// Mock all methods except MyMethod:
subst.Configure().MyOtherMethod().Returns(/*whatever*/)
subst.Configure().MyThirdMethod().Returns(/*whatever*/)
// ...
subst.Configure().MyLastMethod().Returns(/*whatever*/)

标签: c#mockingnsubstitute

解决方案


您可以选择调用普通 sub 的基本实现。

public class MyClass
{
    public virtual int MyMethod() => 42;
    public virtual int MyMethod1() => 1;
    public virtual int MyMethod2() => 2;
    public virtual int MyMethod3() => 3;
}


[Fact]
public void Sample() {
    var sub = Substitute.For<MyClass>();

    sub.When(x => x.MyMethod()).CallBase();            

    // Returns from base:
    Assert.Equal(42, sub.MyMethod());
    // Other methods mocked (return default value for int):
    Assert.Equal(0, sub.MyMethod1());
    Assert.Equal(0, sub.MyMethod2());
    Assert.Equal(0, sub.MyMethod3());
}

请记住免责声明,所有方法MyClass都应该virtual让 NSubstitute 能够使用它们。:)


推荐阅读