NSubstitute ForPartsOf 模拟除一个之外的所有方法?
NSubstitute ForPartsOf mock all methods except one?
使用 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*/)
您可以选择调用普通子程序的基本实现。
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 能够使用它们。 :)
使用 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*/)
您可以选择调用普通子程序的基本实现。
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 能够使用它们。 :)