NSubstitute ForPartsOf模拟除一个以外的所有方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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*/)
答案

您可以选择加入以调用常规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());

[请记住,对于NSubstitute来说,MyClass上的所有方法都应为virtual才能使用它们。 :)

以上是关于NSubstitute ForPartsOf模拟除一个以外的所有方法?的主要内容,如果未能解决你的问题,请参考以下文章

单元测试-隔离框架NSubstitute

使用 NSubstitute 的项目的代码分析 CA0001 错误

NSubstitute DbSet / IQueryable<T>

用NSubstitute来mock

参数匹配不能与 NSubstitute 一起正常工作

在单元测试中验证函数调用顺序