我经常使用 NSubstitute。我喜欢它。
我只是在研究 AutoFixture。看起来不错!
我看过AutoFixture for NSubstitute并在 Moq 中看到了一些关于如何使用此功能的示例。
但我似乎无法将其翻译成 NSubstitute。
我试过这个:
var fixture = new Fixture().Customize(new AutoNSubstituteCustomization());
var addDest = Substitute.For<IPerson>();
使用:
public interface IPersonEntity
{
int ID { get; set; }
string FirstName { get; set;}
string LastName { get; set;}
DateTime DateOfBirth { get; set; }
char Gender { get; set; }
}
我得到一个对象,但没有填充任何属性(类似于 AutoFixture 的要点)。
我也试过:
var fixture = new Fixture().Customize(new AutoNSubstituteCustomization());
var result = fixture.Create<IPersonEntity>();
这也给了我一个没有填充属性的对象。 (请注意,如果我使用 PersonEntity
类执行上述操作,那么所有属性都会被填充。)
我确信有办法使这项工作有效,但我似乎找不到。
那么,鉴于我上面的 IPersonEntity
接口(interface),有谁知道如何使用 AutoFixture 和 NSubstitute 给我一个填充的 IPersonEntity 对象?
最佳答案
除了使用 AutoNSubstituteCustomization
自定义 Fixture
实例之外,您还可以使用以下自定义:
var fixture = new Fixture().Customize(
new AutoPopulatedNSubstitutePropertiesCustomization());
var result = fixture.Create<IPersonEntity>();
// -> All properties should be populated now.
AutoPopulatedNSubstitutePropertiesCustomization
定义为:
internal class AutoPopulatedNSubstitutePropertiesCustomization
: ICustomization
{
public void Customize(IFixture fixture)
{
fixture.ResidueCollectors.Add(
new Postprocessor(
new NSubstituteBuilder(
new MethodInvoker(
new NSubstituteMethodQuery())),
new AutoPropertiesCommand(
new PropertiesOnlySpecification())));
}
private class PropertiesOnlySpecification : IRequestSpecification
{
public bool IsSatisfiedBy(object request)
{
return request is PropertyInfo;
}
}
}
与AutoNSubstituteCustomization
的区别在于上面的自定义也是decorated使用 Postprocessor
实例自动为请求类型的所有公共(public)属性设置值。
引用资料:
上述解决方案的灵感来自以下博客文章 Mark Seemann :
关于c# - 如何将 AutoFixture 与 NSubstitute 结合使用的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18342322/