我正在尝试访问注入构造函数的mocked(通过Nsubstitute)类。
我使用以下代码
var fixture = new Fixture()
.Customize(new AutoNSubstituteCustomization());
var sut = fixture.Create<MyService>();
sut是成功创建的,并且在“MyService”的构造函数上注入了一个名为“IFileUtils”的接口的模拟版本。
但我需要访问它,所以阅读后我相信我需要冻结对象,所以我可以像这样访问它
var fileUtilMock= fixture.Freeze<Mock<IFileUtils>>();
但我认为这段代码是Moq语法,因为“Mock”无法找到。
通常要创建一个类的Nsubstitute,您可以执行以下操作
var fileUtilMock= Substitute.For<IFileUtils>();
但当然这并没有被冻结所以它没有被使用并被注入到构造函数中。
任何人都可以帮忙吗?
答案 0 :(得分:10)
根据this Mocking tools comparison article by Richard Banks的推论以及AutoMoq的工作原理,我相信:
Mock
和Mock.Object
之间没有像Moq那样的分离SpecimenBuilderNode
中的AutoFixture.Auto *扩展挂钩,提供接口的[模拟]实现,即fixture.Create<IFileUtils>()
应该正常工作var result = fixture.Create<IFileUtils>(); fixture.Inject(result)
因此你应该只能说:
var fileUtilMock = fixture.Freeze<IFileUtils>();
答案 1 :(得分:6)
在创建MyService
实例之前,您必须冻结自动模拟的实例。
<强>更新强>:
正如鲁本·巴特林克所指出的那样,在NSubstitute所有你需要做的就是:
var fixture = new Fixture()
.Customize(new AutoNSubstituteCustomization());
var substitute = fixture.Freeze<IFileUtils>();
..然后使用NSubstitute的扩展方法。
这样,冻结的实例将被提供给MyService
构造函数。
示例强>:
对于接口IInterface
:
public interface IInterface
{
object MakeIt(object obj);
}
你要做的就是:
var substitute = fixture.Freeze<IInterface>();
substitute.MakeIt(dummy).Returns(null);
Returns
实际上是NSubstitute中的扩展方法。