【问题标题】:Create an EF entity stub with AutoFixture使用 AutoFixture 创建 EF 实体存根
【发布时间】:2016-02-25 11:36:54
【问题描述】:

例如,我有这些由 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();

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

【问题讨论】:

  • @Enrico Campidoglio,测试永远不会结束。我现在正在尝试收集更多信息。
  • 不要更新你的 Q,包括你的答案。如果您为自己的问题找到了有效的答案,请自己回答,并接受它为有效(我认为您必须等待几天才能这样做)。这使它对社区有用。并且,如果像本例那样,您部分解决了问题,您可以编辑此 Q,回答它,然后创建一个包含新问题的新 Q。工作量要多一些,但要好得多。
  • 您还需要填充PetOwner.Dogs 集合吗?
  • @Enrico Campidoglio,不,我只需要DogPetOwner 导航属性和PetOwnerIDPetOwnerName

标签: c# entity-framework unit-testing stub autofixture


【解决方案1】:

我无法重现该错误。使用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 属性设置为一个空序列,即much better than null

【讨论】:

  • 非常感谢,恩里科!是的,现在我也有这个工作了。 Customize&lt;&gt; 看起来很酷。我的真正的更复杂的代码仍然存在问题,有很多依赖项,如果我发现有用的信息,我会补充这些有用的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
相关资源
最近更新 更多