c# - 使用 AutoFixture 创建 EF 实体 stub

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

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

PetOwner: (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 类型的简单 stub 来进行单元测试。但是当我尝试使用 AutoFixture 生成 stub 时,会抛出递归依赖异常。如果我尝试像这样更改夹具行为,它就会挂起。

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 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 .

关于c# - 使用 AutoFixture 创建 EF 实体 stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33869766/

相关文章:

c# - 带有 NOLOCK 的 Entity Framework

javascript - 从下拉列表中选择值后 MVC 重新加载页面

java - 如何向 JUnit 测试添加参数?是否可以像 testNg 中那样添加它们?

c# - 架构问题 : Fluent NHibernate, 存储库模式和 ASP.NET MVC

c# - Windows 窗体 - 以透明为背景的 PNG

c# - 为什么 C# 4.0 中的可选参数需要编译时常量?

c# - 如何在不使用 Entity Framework 获取值本身的情况下获取 blob 大小

c# - 用于断言特定方法的最简单的单元测试是什么?

PHPUnit|Laravel phpunit 仅运行类测试的第一个测试

c# - 远程桌面 "can' t 连接到远程计算机”