首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NSubstitute、AutoFixture和AutoFixture.AutoNSubstitute替换方法返回

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

Stack Overflow用户
提问于 2015-09-07 17:01:50
回答 1查看 2.6K关注 0票数 2

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

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

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

代码语言:javascript
复制
public class SamplePoco
{
    public string SampleString { get; set; }

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

而这个测试

代码语言:javascript
复制
[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可以像预期的那样工作:

代码语言:javascript
复制
[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具有更多的属性和方法,而且方法比这个简单的例子更复杂。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-08 05:55:04

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

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

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

代码语言:javascript
复制
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

但是,如果要显式地告诉AutoFixture使用NSubstitute创建POCO类,则可以使用AutoDataAttributeSubstituteAttribute相结合。有关此的更多信息,您可以找到这里

编辑

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

代码语言:javascript
复制
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
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32443265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档