我们有用于存储的实体框架的 MVC4 项目。对于我们的测试,我们最近开始使用 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>();
这很有效,而且速度很快。但是这种过度规范使测试难以阅读,有时我会丢失一些重要的细节,比如.With(c => c.PersonId, 42)
在 unimportant 列表中.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;
}
}
}
我似乎无法找到一种方法ISpecimenBuilder
来检测我们正在构建的对象是另一个类中的虚拟成员。可能ISpecimenBuilder
这不是执行此操作的正确位置。还有其他想法吗?