2013-03-17 82 views
1

我有一小組單元測試工作正常,直到我添加一個測試來驗證我的唯一約束是否正常工作。這些不是真正的單元測試,而是集成測試。單元測試執行順序後db4o刪除不起作用

無論如何,如果我省略了驗證唯一約束的測試,那麼刪除就一切正常。但是,如果我添加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)); 
    } 
+0

什麼是'SerialNumber'?這是一堂課嗎? – 2013-03-17 22:20:46

+0

順便說一句,你的測試應該是彼此獨立的。 'DeleteItem_Test'應該創建它將要刪除的項目,而不依賴於另一種測試方法。 – 2013-03-17 22:41:39

+0

SerialNumber只是一個常量,因此當它們有意義時,所有測試都可以在數據庫中使用相同的項目。我在CreateItem中專門爲該帖子硬編碼了它。 – chad 2013-03-17 23:28:09

回答

1

數據類保存方法現在利用在提交()動作的嘗試/捕獲,並執行的應發生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); 
    }