我们有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)
然后去创建复杂的模型.
请享用!
| 归档时间: |
|
| 查看次数: |
2630 次 |
| 最近记录: |