我经常使用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
界面,是否有人知道如何使用AutoFixture和NSubstitute为我提供填充的IPersonEntity对象?
答案 0 :(得分:15)
您可以使用以下自定义代替使用Fixture
自定义AutoNSubstituteCustomization
实例:
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
实例可自动为所请求类型的所有公共属性设置值。
<强>参考强>:
以上解决方案的灵感来自Mark Seemann的以下博客文章:
答案 1 :(得分:1)
尽管当时其他答案已被标记为正确,但我只是想补充一下,您确实可以使用AutoNSubstituteCustomization:
var fixture = new Fixture().Customize(new AutoNSubstituteCustomization() { ConfigureMembers = true});
var result = fixture.Create<IPersonEntity>();
这将导致填充属性。