使用NSubstitute,AutoFixture和AutoFixture.AutoNSubstitute替换方法返回

时间:2015-09-07 17:01:50

标签: c# autofixture nsubstitute

我试图使用NSubstitute(1.8.2),AutoFixture(3.33)和AutoFixture.AutoNSubstitute(3.33)如下:

我有一个poco,它有一个方法,并在我的应用程序中使用。为了测试我的应用程序,我需要模拟poco以及它从方法返回的内容。

这是poco(从我们的实际模型中简化)

public class SamplePoco
{
    public string SampleString { get; set; }

    public virtual string GetFormattedString()
    {
        return this.SampleString + " formatted";
    }
}

和这个测试

[TestMethod]
public void SampleTest()
{
    var fixture = new Fixture().Customize(new AutoConfiguredNSubstituteCustomization());

    var substitute = fixture.Create<SamplePoco>();

    var formattedString = fixture.Create<string>();

    substitute.GetFormattedString().Returns(formattedString);

    // ... test goes here
}

我已经使用我为AutoFixture.AutoMoq找到的代码示例确定了这一点,因为我无法找到AutoFixture.AutoNSubstitute的任何特定样本。

然而,这失败并出现以下错误:

  

NSubstitute.Exceptions.CouldNotSetReturnDueToNoLastCallException:   无法找到回复的电话。

我做错了什么?

使用NSubstitute按预期工作:

[TestMethod]
public void SampleTest()
{
    var fixture = new Fixture().Customize(new AutoConfiguredNSubstituteCustomization());

    var substitute = Substitute.For<SamplePoco>();

    var formattedString = fixture.Create<string>();

    substitute.GetFormattedString().Returns(formattedString);

    // ... test goes here
}

但是,我想使用AutoFixture,因为实际的poco有更多的属性和方法,而且方法比这个简单的例子更复杂。

1 个答案:

答案 0 :(得分:3)

正如您所写,SamplePoco类是POCO,因此当您在第一次测试中调用fixture.Create<SamplePoco>()时,您将获得一个由SamplePoco类创建的全新实例AutoFixture使用反射并调用默认构造函数。

我认为您的第一次测试很好,AutoFixture也创建SampleString,因此您不需要存根GetFormattedString方法。

从测试角度来看,您的GetFormattedString方法包含行为,因此您应该以这种方式测试它:

public void SampleTest()
{
    var fixture = new Fixture().Customize(new AutoConfiguredNSubstituteCustomization());

   var poco = fixture.Create<SamplePoco>();
   Assert.AreEquals(string.Format("{0} {1}", poco.SampleString, "formatted"), poco.GetFormattedString());
}
如果要求AutoConfiguredNSubstituteCustomization创建抽象实例(接口或抽象类),并且还设置该抽象的其他成员以从AutoFixture返回值 AutoFixture p>

但是如果您想明确告诉AutoFixture使用POCO创建NSubstitute课程,您可以将AutoDataAttributeSubstituteAttribute结合使用。有关此内容的更多信息,请访问here

修改

如果您使用的是不允许使用AutoData功能的测试框架,则可以创建更改AutoFixture类的SamplePoco行为的自定义。

public class SamplePocoSubstituteCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Register(() => Substitute.For<SamplePoco>());
    }
}

[TestMethod]
public void SampleTest()
{
    var fixture = new Fixture().Customize(new AutoConfiguredNSubstituteCustomization())
                                   .Customize(new SamplePocoSubstituteCustomization());

    var substitute = fixture.Create<SamplePoco>();

    var formattedString = fixture.Create<string>();

    substitute.GetFormattedString().Returns(formattedString);

    // ... test goes here
}