c# - 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());
}
请记住免责声明,所有方法MyClass
都应该virtual
让 NSubstitute 能够使用它们。:)
推荐阅读
- php - 在 Laravel 中安装 Dropone 时严重性较低
- node.js - React Frontend 与 Go API 集成不同端口问题
- jasper-reports - jasperreports 具有多列的子报表无法正确打印
- python - 并排打印列表
- docker - K6 InfluxDB + Grafana Docker:如何预加载仪表板
- powershell - 如何在执行 Wscript.shell 发送密钥之前选择文件夹内部?
- r - 如何使用 sf::st_intersects 从其邻居列表中过滤掉每个多边形
- azure - 如何在 ARM 模板部署中为资源组字段赋予默认值?
- python - 使用 sendKeys() 在 Selenium 中使用 python 上传文件不起作用
- c++ - boost::hana::length 在使用引用时无法给出 constexpr 结果