1

一意の制約が正しく機能しているかどうかを検証するテストを追加するまで、正常に機能している単体テストの小さなセットがあります。これらは実際には単体テストではなく、統合テストです。

とにかく、一意の制約を検証するテストを省略した場合、すべてが削除で問題ありません。ただし、SerialNumberUniqueConstraint_Testメソッドを追加すると失敗し、削除が行われないため、アイテムクラスはnullになりません。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 に答える