其他分享
首页 > 其他分享> > CodeGo.net>如何告诉Autofixture创建具有不同ID的对象?

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

作者:互联网

我在测试中有一个简单的Setup方法,该方法可以创建一个对象的两个实例(make by和Id以及Description属性),并且已经使用自动修复功能将其完成:

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不能以这种方式与对象属性一起工作,所以现在我使用以下简单的解决方法:

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和随机数创建的,但是如果我调试了我项目的所有测试(使用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()
    {           
    }
}

编辑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; } }
}

标签:autofixture,unit-testing,c
来源: https://codeday.me/bug/20191029/1958366.html