忽略虚拟属性

tra*_*max 12 c# autofixture

我们有MVC4项目与Entity Framework进行存储.对于我们的测试,我们最近开始使用Autofixture,它真的很棒.

我们的模型图非常深,通常通过AutoFixture创建一个对象创建整个图:人 - >团队 - >部门 - >公司 - >合同 - > ....等.

这个问题是时间问题.对象创建需要一秒钟.这导致测试缓慢.

我发现自己做了很多事情是这样的:

        var contract = fixture.Build<PersonContract>()
            .Without(c => c.Person)
            .Without(c => c.PersonContractTemplate)
            .Without(c => c.Occupation)
            .Without(c => c.EmploymentCompany)
            .Create<PersonContract>();
Run Code Online (Sandbox Code Playgroud)

这很有效,而且很快.但是这种过度规范使得测试难以阅读,有时我会忽略重要的细节,就像.With(c => c.PersonId, 42)在不重要的列表中一样.Without().

所有这些被忽略的对象都是Entity Framework的导航属性,并且都是虚拟的.

是否有一种全局方式告诉AutoFixture忽略虚拟成员?

我试过创造ISpecimentBuilder,但没有运气:

public class IgnoreVirtualMembers : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {

        if (request.GetType().IsVirtual // ?? this does not exist )
        {
             return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到一种方法ISpecimenBuilder来检测我们正在构建的对象是另一个类中的虚拟成员.可能ISpecimenBuilder这不是正确的地方.还有其他想法吗?

tra*_*max 21

在Mark的博客上阅读更多内容(特别是这个)我找到了做我想要的方法:

/// <summary>
/// Customisation to ignore the virtual members in the class - helps ignoring the navigational 
/// properties and makes it quicker to generate objects when you don't care about these
/// </summary>
public class IgnoreVirtualMembers : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        var pi = request as PropertyInfo;
        if (pi == null)
        {
            return new NoSpecimen(request);
        }

        if (pi.GetGetMethod().IsVirtual)
        {
            return null;
        }
        return new NoSpecimen(request);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以将这些包装到自定义中:

public class IgnoreVirtualMembersCustomisation : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Customizations.Add(new IgnoreVirtualMembers());
    }
}
Run Code Online (Sandbox Code Playgroud)

所以在你的测试中你只需:

var fixture = new Fixture().Customize(new IgnoreVirtualMembersCustomisation());
Run Code Online (Sandbox Code Playgroud)

然后去创建复杂的模型.

请享用!

  • 我知道,讨厌的z进入所有*sations.在英国它拼写正确,"s" - ))) (5认同)