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

时间:2014-08-21 09:25:06

标签: c# unit-testing autofixture

我在我的测试中有一个简单的Setup方法,它创建了一个对象的实例(make by和Id以及Description属性),我用autofixture完成了它:

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

接下来我尝试将对象保存到db,但是我得到重复密钥的错误,我调试设置并看到o1和o2具有相同的Id

根据Wiki,数字应该是逐步产生的:

Autogenerated Number

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

Sample Result

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

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

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

但不太喜欢

这是一种使用ISpecimenBuilder设置自动混音以使其生成渐进式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 runner的visual studio 2013),id&#39; s被创建为等于

EDIT2

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

1 个答案:

答案 0 :(得分:4)

这是因为在获取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; } }
}