如何 运行 将内联数据与 Automoq 和 Autofixture 一起使用时进行单元测试
How to Run Unit Tests When using inline data with Automoq and Autofixture
我在现有项目上创建了一些单元测试。我正在使用 AutoMoq 将数据注入一些测试。 运行测试后,它抱怨递归错误。我使用以下代码解决了错误:
public sealed class AutoMoqDataAttribute : AutoDataAttribute
{
public AutoMoqDataAttribute()
: base(() => new Fixture().Customize(new DomainCustomization()))
{
}
}
public class OmitRecursionCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b =>
fixture.Behaviors.Remove(b));
fixture.Behaviors.Add(new OmitOnRecursionBehavior());
}
}
public class DomainCustomization : CompositeCustomization
{
public DomainCustomization()
: base(
new AutoMoqCustomization(),
new SupportMutableValueTypesCustomization(),
new OmitRecursionCustomization())
{
}
}
解决递归错误后,测试不会运行。调试输出一直说线程已退出。然后我创建了一些示例 classes 来测试我的设置,它们都 运行,除了现有项目 classes 测试。
我正在编写测试的 class 示例是这样的:
public partial class BusinessContact
{
public int BusinessContactId { get; set; }
public int BusinessId { get; set; }
public int ContactId { get; set; }
public int? AddressId { get; set; }
public int? EmailId { get; set; }
public BusinessContactType.TypeID BusinessContactTypeId { get; set; }
[Column(TypeName = "smalldatetime")]
public DateTime DateLastModified { get; set; }
[StringLength(450)]
public string ModifiedByUserId { get; set; }
[ForeignKey("AddressId")]
[InverseProperty("BusinessContact")]
public virtual Address Address { get; set; }
[ForeignKey("BusinessId")]
[InverseProperty("BusinessContact")]
public virtual Business Business { get; set; }
[ForeignKey("BusinessContactTypeId")]
[InverseProperty("BusinessContact")]
public virtual BusinessContactType BusinessContactType { get; set; }
[ForeignKey("ContactId")]
[InverseProperty("BusinessContact")]
public virtual Contact Contact { get; set; }
[ForeignKey("EmailId")]
[InverseProperty("BusinessContact")]
public virtual Email Email { get; set; }
}
上述 class 的示例测试是这样的:
[Theory]
[AutoMoqData]
public void ValidateMandatoryField(BusinessContact _sut)
{
Assert.NotNull(_sut.BusinessId);
Assert.True(_sut.BusinessId > 0);
}
我打算发送多个内联数据,我可以在其中设置一些 class 属性的值来测试我正在寻找的行为。
谁能告诉我哪里出了问题。
谢谢。
这个 post 解决了我对这个问题的挑战。该问题与使用 Entity framework 时引起的循环引用有关。所以代码完全可以替换或添加到OmitRecursionCustomization class中自定义方法的内容。 class 现在看起来像这样:
{
public void Customize(IFixture fixture)
{
fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b =>
fixture.Behaviors.Remove(b));
fixture.Behaviors.Add(new OmitOnRecursionBehavior());
fixture.Customizations.Add(new IgnoreVirtualMembers());
}
}
其用法如下:
var fixture = new Fixture().Customize(new IgnoreVirtualMembersCustomisation());
我在现有项目上创建了一些单元测试。我正在使用 AutoMoq 将数据注入一些测试。 运行测试后,它抱怨递归错误。我使用以下代码解决了错误:
public sealed class AutoMoqDataAttribute : AutoDataAttribute
{
public AutoMoqDataAttribute()
: base(() => new Fixture().Customize(new DomainCustomization()))
{
}
}
public class OmitRecursionCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b =>
fixture.Behaviors.Remove(b));
fixture.Behaviors.Add(new OmitOnRecursionBehavior());
}
}
public class DomainCustomization : CompositeCustomization
{
public DomainCustomization()
: base(
new AutoMoqCustomization(),
new SupportMutableValueTypesCustomization(),
new OmitRecursionCustomization())
{
}
}
解决递归错误后,测试不会运行。调试输出一直说线程已退出。然后我创建了一些示例 classes 来测试我的设置,它们都 运行,除了现有项目 classes 测试。
我正在编写测试的 class 示例是这样的:
public partial class BusinessContact
{
public int BusinessContactId { get; set; }
public int BusinessId { get; set; }
public int ContactId { get; set; }
public int? AddressId { get; set; }
public int? EmailId { get; set; }
public BusinessContactType.TypeID BusinessContactTypeId { get; set; }
[Column(TypeName = "smalldatetime")]
public DateTime DateLastModified { get; set; }
[StringLength(450)]
public string ModifiedByUserId { get; set; }
[ForeignKey("AddressId")]
[InverseProperty("BusinessContact")]
public virtual Address Address { get; set; }
[ForeignKey("BusinessId")]
[InverseProperty("BusinessContact")]
public virtual Business Business { get; set; }
[ForeignKey("BusinessContactTypeId")]
[InverseProperty("BusinessContact")]
public virtual BusinessContactType BusinessContactType { get; set; }
[ForeignKey("ContactId")]
[InverseProperty("BusinessContact")]
public virtual Contact Contact { get; set; }
[ForeignKey("EmailId")]
[InverseProperty("BusinessContact")]
public virtual Email Email { get; set; }
}
上述 class 的示例测试是这样的:
[Theory]
[AutoMoqData]
public void ValidateMandatoryField(BusinessContact _sut)
{
Assert.NotNull(_sut.BusinessId);
Assert.True(_sut.BusinessId > 0);
}
我打算发送多个内联数据,我可以在其中设置一些 class 属性的值来测试我正在寻找的行为。
谁能告诉我哪里出了问题。
谢谢。
这个 post 解决了我对这个问题的挑战。该问题与使用 Entity framework 时引起的循环引用有关。所以代码完全可以替换或添加到OmitRecursionCustomization class中自定义方法的内容。 class 现在看起来像这样:
{
public void Customize(IFixture fixture)
{
fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b =>
fixture.Behaviors.Remove(b));
fixture.Behaviors.Add(new OmitOnRecursionBehavior());
fixture.Customizations.Add(new IgnoreVirtualMembers());
}
}
其用法如下:
var fixture = new Fixture().Customize(new IgnoreVirtualMembersCustomisation());