gpt4 book ai didi

c# - 使用 NSubstitute、AutoFixture 和 AutoFixture.AutoNSubstitute 替换方法返回

转载 作者:行者123 更新时间:2023-11-30 21:55:15 33 4
gpt4 key购买 nike

我正在尝试使用 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: Could not find a call to return from.

我做错了什么?

使用 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 具有更多的属性和方法,并且这些方法比这个简单的示例更复杂。

最佳答案

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

我认为你的第一次测试很好,AutoFixture还创建一个 SampleString所以,你不需要 stub 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());
}

AutoConfiguredNSubstituteCustomizationAutoFixture 时使用被要求创建抽象实例(接口(interface)或抽象类),它还设置该抽象的其他成员以从 AutoFixture 返回值

但是如果你想明确告诉AutoFixture创建POCO类使用 NSubstitute你可以使用 AutoDataAttribute结合SubstituteAttribute .有关此的更多信息,您可以找到 here


编辑

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

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
}

关于c# - 使用 NSubstitute、AutoFixture 和 AutoFixture.AutoNSubstitute 替换方法返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32443265/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com