2014-11-15 5 views
0

ASP MVC 응용 프로그램을 단위 테스트하고 있습니다. 이제 저장소를 테스트하고 있습니다. 나는 데이터베이스에 atributes ID (기본 키 int), ItemName (varchar), IsValid (비트 - true/false)가있는 테이블이 있습니다. 저장소에는 Create, Update, Delete와 같은 메소드가 있으며 단위 테스트로 테스트하고 있습니다 (테스트는 atribute isValid와 함께 작동합니다). 업데이트를 만들기의 단위 테스트를 실행 한 후단위 테스트 저장소. DBContext가 잘못된 값을 반환하는 이유는 무엇입니까?

public IEnumerable<Item> GetAllItems() 
{ 
return _db.ItemSet.Where(w => w.isValid); 
} 

테스트 getAllWorkitem 방법 또 하나 개의 단위 테스트 방법이 삭제도 방법 getAllItems 있습니다.

[TestMethod] 
    public void GetAllItems_Test() 
    { 
     //Arrange 
     var allWorkitems = _ws.GetAllItems(); 
     //Act 

     //Assert 
     foreach (Item currentItem in allItems) 
     { 
      Assert.AreEqual(true, currentItem.Valid); 
     } 

    } 

모든 테스트를 별도로 실행하면 정상적으로 작동합니다. 모든 테스트를 함께 실행하면 문제가 발생합니다. var allWorkItems에는 isValid = false 및 isValid = true 항목이 있습니다.

dbContext는 테스트 속도가 더 빠른 쿼리와 데이터를 캐싱합니다. 이 chaching을 불가능하게 할 posibitilies가 있습니까? 아니면 다른 문제가 있습니까?

+1

모든 테스트 사이에서'_ws' 객체를 공유하고 있습니까? – DavidG

+0

예 하나의 dbContext와 하나의 dbContext가 있습니다. – Fox

답변

0

각 단위 테스트를 실행하기 전에 테스트 컨텍스트를 깨끗한 상태로 설정해야합니다. 그러면 이전 테스트에서 생성 한 데이터를 지우고 다음 테스트의 경로를 지울 필요가 있다는 뜻입니다.

이렇게하는 한 가지 방법은 테스트 설정 방법을 사용하는 것입니다.

[TestInitialize] 
public void Setup() 
{ 
    // This function will be executed before each test. 
    // Use this function as an opportunity to clear any shared objects e.g. 
    // dbContext <- Delete all data that is not required. 
} 

[TestMethod] 
public void Test1() 
{ 
    // Arrange. 
    // Add 1 item to the dbContext 

    // Act 
    var actual = _ws.GetAllItems(); 

    // Assert. 
    Assert.AreEqual(1, actual.Count()); 
} 

[TestMethod] 
public void Test2() 
{ 
    // Arrange. 
    // Here, the dbContext will have been cleared in the Setup() function. 
    // Add 5 items to the dbContext 

    // Act 
    var actual = _ws.GetAllItems(); 

    // Assert. 
    Assert.AreEqual(5, actual.Count()); // Total items should be 5, not 6. 
} 

위의 코드는 모두 가설입니다. 나는 즉시 작성했습니다. 그러나 그것은 각 단위 테스트를 실행하기 전에 예상되는 상태에 있도록 구성해야한다는 요지를 설명합니다.

편집 :

귀하의 의견을 바탕으로, 사용자의 설정 방법은 다음과 같을 수 있습니다 :

[TestInitialize] 
public void Setup() 
{ 
    _db = new MyIContainer(); 
    _ws = new ItemService(_db); 
} 

그런 식으로, 각각의 테스트는 새로운 객체로 작업되며, 이전 테스트에서 더 느린 데이터.

+0

완벽하게 들리 네요. 설치에서 무엇을해야합니까? 개인 정적 MyIContainer _db = new MyIContainer(); 및 IItemService _ws = 새 ItemService (_db); 주석 [TestInitialize]을 사용하여 메소드에서 다시 동화시켜야합니까? – Fox