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