2013-03-17 4 views
1

고유 제한이 제대로 작동하는지 확인하는 테스트를 추가 할 때까지 제대로 작동하는 단위 테스트 세트가 있습니다. 이것은 실제로 단위 테스트가 아니며 통합 테스트입니다.단위 테스트 실행 시퀀스 후 db4o 삭제가 작동하지 않습니다.

필자는 고유 제약 조건의 유효성을 검사하는 테스트를 생략하면 모두 삭제와 잘 일치합니다. 그러나 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)); 
    } 
+0

'SerialNumber'란 무엇입니까? 그게 수업인가요? –

+0

그건 그렇고, 당신의 테스트는 서로 독립적이어야합니다. 'DeleteItem_Test'는 다른 테스트 메소드에 의존하지 않고 삭제하려고하는 것과 동일한 아이템을 생성해야합니다. –

+0

SerialNumber는 단지 const이므로 모든 테스트가 DB에있는 동일한 항목과 함께 작동하는 것이 이해가되면 DB에서 작동합니다. 나는 특히 게시물에 대한 CreateItem에서 하드 코드했습니다. – chad

답변

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); 
    }