1

我有一小部分工作正常的单元测试,直到我添加一个测试来验证我的唯一约束是否正常工作。这些不是真正的单元测试,它们是集成测试。

无论如何,如果我省略了验证唯一约束的测试,那么删除一切都很好。但是,如果我添加 SerialNumberUniqueConstraint_Test 方法,它会失败并且我的项目类不为空,因为删除永远不会发生。如果我将 SerialNumberUniqueConstraint_Test 移动到其他测试之前,则后续测试也会失败并出现相同的 UniqueFieldValueConstraintValidationException。我做错了什么?

    [TestMethod]
    [ExpectedException( typeof( UniqueFieldValueConstraintViolationException ) )]
    public void SerialNumberUniqueConstraint_Test()
    {
        using( var logic = new ItemLogic() )
        {
            logic.Save( CreateItem() );
        }
    }

    [TestMethod]
    public void DeleteItem_Test()
    {
        Item item = null;

        using( var logic = new ItemLogic() )
        {
            logic.Delete( SerialNumber );
        }

        using( var logic = new ItemLogic() )
        {
            item = logic.Retrieve( SerialNumber );
        }

        Assert.IsNull( item );
    }

    private Item CreateItem()
    {
        return new Item { Name = "My item", Make = "make", Model = "model", SerialNumber = "1234" };
    }

    public Item Save( Item item )
    {
        Db4oDatabase.Database.Store( item );
        Db4oDatabase.Database.Commit();

        return this.Retrieve( item.SerialNumber );
    }

    public Item Retrieve( string serialNumber )
    {
        Item item = (from   i in Db4oDatabase.Database.AsQueryable<Item>()
                     where  i.SerialNumber == serialNumber
                     select i).FirstOrDefault();            

        return item;
    }

    public void Delete( string serialNumber )
    {
        Db4oDatabase.Database.Delete( this.Retrieve( serialNumber ) );
    }
4

1 回答 1

1

数据类的 Save 方法现在在 Commit() 操作上使用 try/catch 并在 UniqueFieldValueConstraintViolationException 发生时执行回滚。此外,我已按照 Bob Horn 的建议使 DeleteItem_Test 独立。

    public Item Save( Item item )
    {
        Db4oDatabase.Database.Store( item );

        try
        {
            Db4oDatabase.Database.Commit();
        }
        catch( UniqueFieldValueConstraintViolationException )
        {
            Db4oDatabase.Database.Rollback();
            throw;
        }

        return this.Retrieve( item.SerialNumber );
    }

    [TestMethod]
    public void DeleteItem_Test()
    {
        string serialNumber = "DeleteItem_Test";

        Item item = new Item
        {
            Name          = "Washer",
            Make          = "Samsung",
            Model         = "Model No",
            SerialNumber  = serialNumber,
            PurchasePrice = 2500m
        };

        using( var logic = new ItemLogic() )
        {
            item = logic.Save( item );

            Assert.IsNotNull( item, TestResources.DevMessage_IntermediateOperationFailed, "Save", serialNumber );

            logic.Delete( item );                

            item = logic.Retrieve( serialNumber );
        }

        Assert.IsNull( item );
    }
于 2013-03-18T00:22:28.487 回答