2012-07-12 3 views
0

나는 save() 메소드를 가지고 있는데, 테스트하는 방법은 잘 모른다. 아래 코드는 내 코드입니다. 저장 방법moq, 저장 방법을 테스트하는 방법은 무엇입니까?

public interface IRepository<T> 
{ 
    T Get(int id); 
    void Save(T item); 
    void Delete(int id); 
} 

나는 값을 비교할 수 없습니다, 다시 모든 값을 반환하지 않습니다. 그러나, 나는 이미 4 명의 사용자가 있으며, 다른 사용자를 추가 한 후에는 전체 사용자 수만 검사합니다. 테스트하는 것으로 충분합니까?

[Test] 
public void Add_a_new_smoothie_user_should_return_total_5_users() 
{ 
    // Arrange 

    var totalUsers = _users.Count(); 

    _mockUserRepository.Setup(s => s.Save(It.IsAny<User>())) 
     .Callback((User user) => _users.Add(user)); 

    var newUser = new User 
         { 
          Id = 3, 
          Email = "[email protected]", 
          Password = "1234567".Hash(), 
          Firstname = "", 
          Lastname = "", 

          CreatedDate = DateTime.Now, 
          LastLogin = DateTime.Now, 

          AccountType = AccountType.Smoothie, 
          DisplayName = "", 
          Avatar = "", 
          ThirdPartyId = "", 
          Status = Status.Approved, 
          Ip = "127.0.0.1" 
         }; 

    // Act 

    _mockUserRepository.Object.Save(newUser); 

    // Assert 

    Assert.AreEqual(5, _users.Count()); 
    Assert.AreEqual(1, _users.Count() - totalUsers); 
} 
+0

'저장'방법을 설명 할 수 있습니까? '코드 적용 범위'가 있습니까? 나는 당신의 모의에 'x'사용자를 추가하는 것이 효과적으로 방법을 검증 할 것이라고 생각하지 않는다. 코드 커버리지가 합리적으로 높아 지도록 모든 플로우 (주, 대안, 예외 등)를 테스트하는 데 집중해야합니다. – Channs

+0

나는 위임을 실행하는 방법을 moq 저장소에 저장하지 않는다. 너 여기서 뭘 시험해?이 테스트에서 실행되는 코드를 공급자가 테스트 할 수 있습니까? – Rafal

+0

내 "저장"방법은 새 사용자를 데이터베이스에 저장하기 만합니다. 나는 아직 코드를 가지고 있지 않다. 단지 인터페이스 일 뿐이다. 난 당신이 먼저 구체적인 테스트 방법을 작성하기 전에 단위 테스트를 작성해야한다고 생각. – qinking126

답변

3

테스트하려는 기능의 일부를 조롱하고 있습니다. 이 테스트는 사용자를 보유하고있는 데이터 유형의 Add() 메소드 이외의 다른 것을 증명하지 못합니다. 결국 저장소가 작동하고 있다면 아이디어를 내지 못합니다.

리포지토리 기능을 테스트하기 위해 Database Sandbox을 구현해야합니다.

+0

저장소 패턴을 사용 중입니다. 지금은 인터페이스 만 있고 구체적 구현은 없습니다. 나는 그것이 당신이 어떻게 단위 테스트를하는지, 먼저 시험을 작성한 다음, 시험에 기초하여, 당신의 구체적인 방법을 쓰는 것이라고 생각했습니다. 어떻게하면 저장 방법을 테스트 할 수 있는지 예제를 알려주시겠습니까? 내 저장 방법은 데이터베이스에 새 사용자를 저장합니다. – qinking126

+0

"저장소 기능을 테스트하기위한 데이터베이스 샌드 박스 구현" Idon't는 이것이 단위 테스트 다라고 생각한다. – qinking126

+0

저장소가 있으므로 다른 클래스의 DB 작업에 대해 걱정할 필요가 없습니다. 필요한 경우 DB를 조롱하고 테스트에서 DB 작업이 진행되는 것처럼 행동 할 수 있습니다. 결국, 단위 테스트 또는하지, 당신은 또한 저장소가 작동하는지 확인해야합니다. 나는 그것이 당신이 성취하고자하는 일이라고 생각했습니다. –

0

저장소가 저장되는 위치는 어디입니까? 파일을 저장하는 경우 파일을 수동으로 확인한 모든 모델 파일 (금색)과 비교할 수 있습니다. 데이터베이스가 있다면 데이터베이스 인터페이스를 조롱하고 모든 삽입 쿼리를 기록한 다음 이상적인 로그와 로그를 비교해야합니다.

1

조롱 된 코드에 대한 테스트는 실제로 테스트하지 않으므로 절대로 테스트를 작성하지 마십시오 (물론 조롱 프레임 워크 구현 제외).

테스트 우선 접근 방식으로 인터페이스를 만드는 방법은 무엇입니까? 그것은 간단합니다. 일부 데이터가 필요한 FooController이 있다고 가정하십시오. 어떤 시점에서 (컨트롤러 테스트를 작성하는 동안) 컨트롤러에 데이터를 제공하는 몇 가지 종속성이 있음을 결정합니다 (예, 저장소). 현재 컨트롤러 테스트에는 데이터 저장 장치에서 일부 Bar 개체를 가져 오기위한 일부 기능이 필요합니다. 이 시점에서 당신이 컨트롤러가 필요 IBarRepository 인터페이스를 가지고 있지 않기 때문에 그래서, 당신은,이 테스트는 컴파일되지 않습니다 테스트

Mock<IBarRepository> repositoryMock = new Mock<IBarRepository>(); 
repositoryMock.Setup(r => r.GetById(It.IsAny<int>()).Returns(new Bar()); 
FooController controller = new FooController(repositoryMock.Object); 
controller.Exercise(); 

물품. 이 인터페이스를 생성합니다. 그리고 메서드 GetById을이 인터페이스에 추가합니다. 그 후에 컨트롤러를 구현합니다.

좋은 소식 - 컨트롤러가 완료되면 컨트롤러에 매우 편리한 API가있는 IBarRepository 인터페이스 정의가 있습니다.

다음 단계는 IBarRepository 구현을 만듭니다. 나는 거의 저장소에 대한 테스트를 작성하지 않는다. 그러나, 당신은 여러 가지 방법으로 그것을 할 수 있습니다 :

  • 당신은 (등 ORM 프레임 워크, ADO.NET 클래스) 저장소에 의해 사용되는 데이터 액세스 코드, 당신은 이러한 종속성을 조롱하고 저장소 구현되었는지 확인할 수있는 경우 기본 데이터 액세스 코드에 대해 필요한 모든 호출을 수행합니다. 이 테스트는 꽤 부서지기 쉽습니다. 드물게 리포지토리에 복잡한 비즈니스 로직이 포함되어 있기 때문에 많은 이점을주지 마십시오.
  • 실제 데이터베이스 (예 : 인 메모리 SQLite)를 사용하여 통합 테스트를 수행하고 데이터가 실제로 데이터베이스 테이블에서 CRUD 처리되었는지 확인할 수 있습니다. 이러한 테스트는 또한 취성이 있고 매우 시간 소모적입니다. 하지만이 경우 저장소가 제대로 작동하는지 확인해야합니다.
관련 문제