我试图使用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有更多的属性和方法,而且方法比这个简单的例子更复杂。
答案 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
课程,您可以将AutoDataAttribute
与SubstituteAttribute
结合使用。有关此内容的更多信息,请访问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
}