使用AutoFixture创建EF实体存根

本文关键字:实体 存根 EF 创建 AutoFixture 使用 | 更新日期: 2023-09-27 18:23:53

例如,我得到了EF Database First生成的这些分部类:

狗: (EF实体)

public partial class Dog
{
    public int DogID { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public int PetOwnerID { get; set; }
    // Navigation property
    public virtual PetOwner PetOwner { get; set; }
}

宠物主人:(EF实体)

public partial class PetOwner
{
    public int PetOwnerID { get; set; }
    public string PetOwnerName { get; set; }
    // Navigation property
    public virtual ICollection<Dog> Dogs { get; set; }
}

我需要一个Dog类型的简单存根来进行单元测试。但是,当我尝试使用AutoFixture生成存根时,会引发递归依赖异常。如果我试图像这样改变固定装置的行为,它会挂起。

var fixture = new Fixture();
fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b => fixture.Behaviors.Remove(b));
fixture.Behaviors.Add(new OmitOnRecursionBehavior(1));
var dog = fixture.Create<Dog>();

这里我不需要任何EF功能,只需要一个简单的类,它有一个要测试的属性。我有NUnit,Moq,AutoFixture。

更新:

var dog = fixture.Build<Dog>().Without(x => x.PetOwner).Create();

这解决了问题,但我需要一个导航属性不为null。

使用AutoFixture创建EF实体存根

我无法重现错误。使用AutoFixture 3.36.12:,此测试合格

[Test]
public void CreateEntityWithNavigationProperty()
{
    var fixture = new Fixture();
    fixture.Behaviors.Add(new OmitOnRecursionBehavior());
    var dog = fixture.Create<Dog>();
    Assert.That(dog.PetOwner, Is.Not.Null);
    Assert.That(dog.PetOwner.Dogs, Is.Empty);
}

但是,作为一种变通方法,您可以显式自定义AutoFixture以创建PetOwner类型的对象,而无需填充PetOwner.Dogs属性:

[Test]
public void CreateEntityWithNavigationProperty()
{
    var fixture = new Fixture();
    fixture.Customize<PetOwner>(c =>
        c.With(owner => owner.Dogs, Enumerable.Empty<Dog>()));
    var dog = fixture.Create<Dog>();
    Assert.That(dog.PetOwner, Is.Not.Null);
    Assert.That(dog.PetOwner.Dogs, Is.Empty);
}

这产生了与先前测试相同的结果,其中PetOwner.Dogs属性被设置为空序列,这比null好得多。