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

gt.*_*ush 4 c# unit-testing autofixture

我在测试中有一个简单的安装方法,它可以创建一个对象的两个实例(由和Id以及一个Description属性),并且已经通过自动修复完成了:

MyObject o1 = fixture.Create<MyObject>();
MyObject o2 = fixture.Create<MyObject>();
Run Code Online (Sandbox Code Playgroud)

接下来,我尝试将对象保存到db,但是出现重复密钥错误,我调试了安装程序,并看到o1和o2具有相同的含义 Id

根据Wiki,编号应逐步生成:

Autogenerated Number

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

Sample Result

int: 1, followed by 2, then by 3, etc.
Run Code Online (Sandbox Code Playgroud)

但似乎id不能以这种方式与对象属性一起工作,所以现在我使用以下简单的解决方法:

MyObject o1= fixture.Build<MyObject>().With(x => x.Id, 1).Create();
MyObject o2= fixture.Build<MyObject>().With(x => x.Id, 2).Create();
Run Code Online (Sandbox Code Playgroud)

但不是很喜欢

这是一种ISpecimenBuilder用于设置自动装置以使其生成渐进ID的方法吗?

更多信息:

这是我的基础测试课:

public class BaseDBTest
{       
    public BaseDBTest()
    { }
    public Ploeh.AutoFixture.Fixture fixture { get { return new Fixture(); } }
}
Run Code Online (Sandbox Code Playgroud)

和测试设置:

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

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

奇怪的是:

如果我调试的特定测试对象是使用不同的ID和随机数创建的,但是如果我调试了我项目的所有测试(使用Visual Studio 2013使用NunitRunner,则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()
    {           
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑3

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

单个测试运行链接

项目测试运行链接

dem*_*key 5

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

更改此:

public class BaseDBTest
{       
    public BaseDBTest()
    { }
    public Ploeh.AutoFixture.Fixture fixture { get { return new Fixture(); } }
}
Run Code Online (Sandbox Code Playgroud)

对此:

public class BaseDBTest
{     
    private Fixture _fixture = new Fixture();
    public BaseDBTest()
    { }
    public Ploeh.AutoFixture.Fixture fixture { get { return _fixture; } }
}
Run Code Online (Sandbox Code Playgroud)