C# 忽略虚拟属性
我们有一个MVC4项目,带有实体存储框架。 在我们的测试中,我们最近开始使用Autofixture,它真的很棒 我们的模型图非常深,通常通过AutoFixture创建一个对象来创建整个图:人员->团队->部门->公司->合同->合同。。。。等等 问题是时间创建对象最多需要一秒钟。这会导致缓慢的测试 我发现自己经常做这样的事情:C# 忽略虚拟属性,c#,autofixture,C#,Autofixture,我们有一个MVC4项目,带有实体存储框架。 在我们的测试中,我们最近开始使用Autofixture,它真的很棒 我们的模型图非常深,通常通过AutoFixture创建一个对象来创建整个图:人员->团队->部门->公司->合同->合同。。。。等等 问题是时间创建对象最多需要一秒钟。这会导致缓慢的测试 我发现自己经常做这样的事情: var contract = fixture.Build<PersonContract>() .Without(c =
var contract = fixture.Build<PersonContract>()
.Without(c => c.Person)
.Without(c => c.PersonContractTemplate)
.Without(c => c.Occupation)
.Without(c => c.EmploymentCompany)
.Create<PersonContract>();
我似乎无法在
ISpecimenBuilder
中找到一种方法来检测我们正在构造的对象是另一个类中的虚拟成员。可能ISpecimenBuilder
这不是执行此操作的正确位置。还有其他想法吗?在马克的博客上多读一点()我找到了做我想做的事情的方法:
/// <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);
}
}
因此,在测试中,您只需执行以下操作:
var fixture = new Fixture().Customize(new IgnoreVirtualMembersCustomisation());
然后去创建你的复杂模型
享受吧 我也遇到了同样的问题,决定更进一步,创建一个对延迟加载导航属性的定制。该项目正在进行中 考虑下面的简单对象图,它具有循环依赖关系:
class Foo
{
public int Id { get; set; }
public int BarId { get; set; }
public virtual Bar Bar { get; set; }
}
class Bar
{
public int Id { get; set; }
public int FooId { get; set; }
public virtual Foo Foo { get; set; }
}
通过此自定义,调用var foo=fixture.Create()
将创建类型为foo
的对象。调用foo.Bar
getter将使用DynamicProxy和AutoFixture动态创建Bar
的实例并将其分配给该属性。对foo.Bar
的后续调用返回相同的对象
注意:自定义不够智能,无法设置
foo.Bar.foo=foo
-如果需要,必须手动执行此操作。然而,至少在美国,Customisations的拼写是Customizations.:)我知道,讨厌的z会让人觉得很无聊。在英国,它拼写正确,带有“s”-))这是一个非常好的解决方案。我能够将这些课程放到我的项目中,并立即将它们与Moq一起使用。干得好!太棒了!谢谢大家!@AlexFoxGill,您的项目不再与最新的AutoFixture 3.3+兼容。尝试使用自定义项运行UT时,会生成一个错误,说明程序集不正确。@AlexFoxGill有什么计划要解决吗?希望这只是需要更新对Ploeh.AutoFixture的引用,然后重新生成,而不是其他。@Encryption yes-我已经在GitHub跟踪器上添加了一个,并将在我可以(或者其他人可能有漏洞)的时候访问它。@Encryption我在最新的NuGet版本(0.5.0)中更新了对AutoFixture.3.37.0的引用
var fixture = new Fixture().Customize(new IgnoreVirtualMembersCustomisation());
class Foo
{
public int Id { get; set; }
public int BarId { get; set; }
public virtual Bar Bar { get; set; }
}
class Bar
{
public int Id { get; set; }
public int FooId { get; set; }
public virtual Foo Foo { get; set; }
}