如何在NSubstitute中使用AutoFixture的示例

Vac*_*ano 15 .net c# autofixture nsubstitute

我经常使用NSubstitute.我喜欢它.

我只是在研究AutoFixture.看起来很棒!

我见过NSFstitute的AutoFixture,并在Moq中看到了一些如何使用此功能的例子.

但我似乎无法将其翻译成NSubstitute.

我试过这个:

var fixture = new Fixture().Customize(new AutoNSubstituteCustomization());  
var addDest = Substitute.For<IPerson>();
Run Code Online (Sandbox Code Playgroud)

使用:

public interface IPersonEntity
{    
   int ID { get; set; }
   string FirstName { get; set;}
   string LastName { get; set;}
   DateTime DateOfBirth { get; set; }
   char Gender { get; set; }    
}
Run Code Online (Sandbox Code Playgroud)

我得到一个对象,但没有填充任何属性(类似于AutoFixture的点).

我也尝试过:

var fixture = new Fixture().Customize(new AutoNSubstituteCustomization());
var result = fixture.Create<IPersonEntity>();
Run Code Online (Sandbox Code Playgroud)

这也给了我一个没有填充属性的对象.(请注意,如果我使用PersonEntity类进行上述操作,则会填充属性.)

我确信有一种方法可以使这项工作,但我似乎无法找到它.

那么,鉴于我的IPersonEntity界面,有没有人知道如何使用AutoFixture和NSubstitute给我一个填充的IPersonEntity对象?

Nik*_*nis 17

您可以使用以下自定义代替使用自定义Fixture实例AutoNSubstituteCustomization:

var fixture = new Fixture().Customize(
    new AutoPopulatedNSubstitutePropertiesCustomization());

var result = fixture.Create<IPersonEntity>();
// -> All properties should be populated now.
Run Code Online (Sandbox Code Playgroud)

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

与之不同的AutoNSubstituteCustomization是,上述自定义还使用实例进行修饰,Postprocessor以自动为所请求类型的所有公共属性设置值.

参考文献:

以上解决方案的灵感来自Mark Seemann的以下博客文章:


Nav*_*vie 9

尽管当时其他答案已被标记为正确,但我只是想补充一下,为了完整起见,您确实可以使用 AutoNSubstituteCustomization:

var fixture = new Fixture().Customize(new AutoNSubstituteCustomization() { ConfigureMembers = true});  
var result = fixture.Create<IPersonEntity>();
Run Code Online (Sandbox Code Playgroud)

这将导致属性被填充。