Autofixture + NSubstitute:冻结模拟?

时间:2013-06-25 15:25:45

标签: c# mocking autofixture nsubstitute

我正在尝试访问注入构造函数的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>();

但当然这并没有被冻结所以它没有被使用并被注入到构造函数中。

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:10)

根据this Mocking tools comparison article by Richard Banks的推论以及AutoMoq的工作原理,我相信:

  • NSubstitute在MockMock.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中的扩展方法。