6

我正在尝试访问注入到构造函数中的模拟(通过 Nsubstitute)类。

我正在使用以下代码

var fixture = new Fixture()
    .Customize(new AutoNSubstituteCustomization());

var sut = fixture.Create<MyService>();

sut 被成功创建,一个名为“IFileUtils”的接口的模拟版本被注入到“MyService”的构造函数中。

但我需要访问它,所以在阅读后我相信我需要冻结对象,所以我可以像这样访问它

var fileUtilMock= fixture.Freeze<Mock<IFileUtils>>();

但我认为这段代码是 Moq 语法,因为找不到“Mock”。

通常,要创建一个类的 Nsubstitute,您可以执行以下操作

var fileUtilMock= Substitute.For<IFileUtils>();

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

谁能帮忙?

4

2 回答 2

10

根据Richard Banks 的这篇 Mocking tools 比较文章的推论,以及 AutoMoq 的工作原理,我相信:

  • MockNSubstitute与Mock.ObjectMoq之间没有区别
  • 一个 AutoFixture.Auto* 扩展钩子SpecimenBuilderNode提供接口的 [mocked] 实现,即fixture.Create<IFileUtils>()应该工作
  • 冻结相当于var result = fixture.Create<IFileUtils>(); fixture.Inject(result)

因此,您应该只能说:

var fileUtilMock = fixture.Freeze<IFileUtils>();
于 2013-06-26T09:25:27.193 回答
6

您必须在创建实例之前冻结MyService自动模拟的实例。

更新

正如 Ruben Bartelink 所指出的,使用 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 中的一个扩展方法。

于 2013-06-25T20:17:32.510 回答