我试图使用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具有更多的属性和方法,而且方法比这个简单的例子更复杂。
发布于 2015-09-08 05:55:04
正如您所写的,SamplePoco类是一个POCO,所以当您在第一个测试中调用fixture.Create<SamplePoco>()时,您将得到一个由AutoFixture使用反射和调用默认构造函数创建的新的SamplePoco类实例。
我认为您的第一个测试很好,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。
但是,如果要显式地告诉AutoFixture使用NSubstitute创建POCO类,则可以使用AutoDataAttribute与SubstituteAttribute相结合。有关此的更多信息,您可以找到这里。
编辑
如果使用不允许使用AutoData特性的测试框架,则可以创建可更改SamplePoco类的AutoFixture行为的自定义。
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
}https://stackoverflow.com/questions/32443265
复制相似问题