代码之家  ›  专栏  ›  技术社区  ›  gt.guybrush

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

  •  7
  • gt.guybrush  · 技术社区  · 10 年前

    我的测试中有一个简单的Setup方法,它创建了一个对象的两个实例(make by和 Id 和一个 Description 财产),我已经用autofixture完成了:

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

    接下来,我尝试将对象保存到数据库,但我得到了重复键的错误,我调试了设置,并看到o1和o2具有相同的 身份证件

    根据 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 runner的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

    1 回复  |  直到 10 年前
        1
  •  9
  •   demoncodemonkey    10 年前

    这是因为在获取夹具的基类属性中,每次都会返回一个新的夹具对象。只能保证每个夹具实例自动生成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; } }
    }