gpt4 book ai didi

c# - 如何告诉 Autofixture 创建具有不同 ID 的对象?

转载 作者:行者123 更新时间:2023-12-02 03:17:01 24 4
gpt4 key购买 nike

我在测试中有一个简单的设置方法,它创建一个对象的两个实例(make by 和 IdDescription 属性),并且我已经使用 autofixture 完成了它:

MyObject o1 = fixture.Create<MyObject>();
MyObject o2 = fixture.Create<MyObject>();

接下来我尝试将对象保存到数据库,但出现重复键错误,我调试设置并看到 o1 和 o2 具有相同的 Id

根据Wiki ,数字应该逐步生成:

Autogenerated Number

int autoGeneratedNumber = fixture.Create<int>();

Sample Result

int: 1, followed by 2, then by 3, etc.

但似乎 id 不能以这种方式处理对象属性,所以现在我使用这个简单的解决方法:

MyObject o1= fixture.Build<MyObject>().With(x => x.Id, 1).Create();
MyObject o2= fixture.Build<MyObject>().With(x => x.Id, 2).Create();

但是不太喜欢

这里有一种使用ISpecimenBuilder来设置Autofixture以使其生成渐进式ID的方法吗?

更多信息:

这是我的基本测试类:

public class BaseDBTest
{
public BaseDBTest()
{ }
public Ploeh.AutoFixture.Fixture fixture { get { return new Fixture(); } }
}

和测试设置:

[TestFixture]
public class MyObjectTests : BaseDBTest
{
MyObject o1;
MyObject o2;

[TestFixtureSetUp]
public void CreaDati()
{
o1= fixture.Create<MyObject >();
o2= fixture.Create<MyObject >();
}
}

奇怪的是:

如果我调试特定的测试对象是使用不同的 id 和随机创建的,但如果我调试项目的所有测试(使用 Nunit 运行器的 Visual Studio 2013),则 id 创建为相等

编辑2

MyObject 定义,相当复杂,抱歉:

public class MyObject: LookUpObject<MyObject, int>
{
}

public abstract class LookUpObject<TObject, TKeyType> : EquatableObject<TObject>, IKeyedEntity<TKeyType>
where TObject : class
where TKeyType : struct
{
private TKeyType id;
private string description;
private bool isValid;

public virtual TKeyType Id
{
get { return id; }
set { id = value; }
}

public virtual string Description
{
get { return description; }
set { description= value; }
}
public virtual bool IsValid
{
get { return isValid; }
set { isValid= value; }
}

protected LookUpObject()
{
}
}

编辑3

用 Nunit 制作的奇怪事物的图像(我担心它可能取决于 Visual Studio),

单次测试运行link

项目试运行link

最佳答案

这是因为在获取 Fixture 的基类属性中,每次都会返回一个新的 Fixture 对象。只能保证每个 Fixture 实例自动生成 Id。

更改此:

public class BaseDBTest
{
public BaseDBTest()
{ }
public Ploeh.AutoFixture.Fixture fixture { get { return new Fixture(); } }
}

对此:

public class BaseDBTest
{
private Fixture _fixture = new Fixture();
public BaseDBTest()
{ }
public Ploeh.AutoFixture.Fixture fixture { get { return _fixture; } }
}

关于c# - 如何告诉 Autofixture 创建具有不同 ID 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25422729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com