如何将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对象吗

如何将AutoFixture与NSubstitute一起使用的示例

您可以使用以下自定义项,而不是使用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>();

这将导致属性被填充。