我经常使用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对象吗?
代替使用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的以下博客文章:
尽管当时其他答案已被标记为正确,但为完整起见,我只是想补充一点,您确实可以使用AutoNSubstituteCustomization:
var fixture = new Fixture().Customize(new AutoNSubstituteCustomization() { ConfigureMembers = true});
var result = fixture.Create<IPersonEntity>();
这将导致填充属性。