我在我的测试中有一个简单的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
答案 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; } }
}