如何将AutoFixture与NSubstitute一起使用的示例
本文关键字:一起 NSubstitute AutoFixture | 更新日期: 2023-09-27 18:28:32
我经常使用NSubstitute。我喜欢它。
我只是在研究AutoFixture。看起来很棒!
我看过NSubstitute的AutoFixture,并在Moq中看到了一些关于如何使用此功能的示例。
但我似乎无法将其翻译成N取代。
我试过这个:
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对象吗
您可以使用以下自定义项,而不是使用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
的不同之处在于,上面的自定义还使用Postprocessor
实例进行装饰,以自动设置所请求类型的所有公共属性的值。
参考:
上述解决方案的灵感来自Mark Seemann的以下博客文章:
- 如何配置AutoMoq以设置所有属性
- 如何使用AutoMoq自动填充属性
尽管当时另一个答案被标记为正确,但为了完整起见,我只想补充一点,您确实可以使用AutoNSubstituteCustomization:
var fixture = new Fixture().Customize(new AutoNSubstituteCustomization() { ConfigureMembers = true});
var result = fixture.Create<IPersonEntity>();
这将导致属性被填充。