如何 运行 将内联数据与 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());