2011-11-10 3 views
-1

모델 저장소를 테스트하여 메시지 버스를 호출하는지 확인했습니다. 이것은 좋은 테스트가 아닌지 잘 모르겠다.하지만 내 생각은 다음과 같다. 보통 컨트롤러에 bus.send를 넣을 것이다. (이것은 MVC 웹 애플리케이션이다.)하지만 컨트롤러를 테스트하고 싶지는 않다. 논리, 나는 이것을 저장소로 옮겼다. 내 경우에는 컨트롤러가 간단합니다. 저장소는 버스와 모델 데이터베이스를 사용하여 뷰 모델을 작성합니다.moq 및 mspec과 관련된 조롱 된 종속성에 대해 메서드가 호출되었다는 것을 어떻게 알릴 수 있습니까?

어쨌든이 문제는 내가 실행중인 moq 테스트입니다. 나는 버스를 조롱했고 저장소에서 호출되었는지 확인하려고했다.

시험은 다음과 같다 :

public class when_creating_new_clinic 
{ 
    Establish context =() => 
    { 
     clinicID = Guid.NewGuid(); 
     model = new ClinicModel 
     { 
      ClinicID = clinicID, 
      Alias = "alias", 
      Title = "title" 
      // stuff omitted 
     }; 
     newClinicData = new NewClinicData 
     { 
      ClinicID = clinicID, 
      Alias = "alias", 
      Title = "title" 
      // stuff omitted 
     }; 
     cmd = new CreateClinicCmd(newClinicData); 
     bus = new Mock<IMessageBusAgent>(); 
     repository = new ClinicModelRepository(bus.Object); 

     bus.Setup(b => b.Send(cmd)); 
    }; 

    Because it =() => repository.Create(model); 

    It should_send_create_clinic_command_to_bus =() => 
    { 
     bus.Verify(b => b.Send(cmd), Times.Exactly(1)); 
    }; 

    static ClinicModelRepository repository; 
    static ClinicModel model; 
    static Mock<IMessageBusAgent> bus; 
    static NewClinicData newClinicData; 
    static Guid clinicID; 
    static CreateClinicCmd cmd; 
} 

저장소의 요지는이 경우 : IMessageBusAgent 선언

public class ClinicModelRepository : IClinicModelRepository 
{ 
    private readonly IMessageBusAgent m_bus; 

    public ClinicModelRepository(IMessageBusAgent bus) 
     : this() 
    { 
     m_bus = bus; 
    } 

    public void Create(ClinicModel clinicModel) 
    { 
     // stuff omitted (data is mapped from clinicModel)   

     m_bus.Send(new CreateClinicCmd(data)); 
    } 
} 

로서 :

public interface IMessageBusAgent : IDomainCommandSender, IDomainEventPublisher, IUnitOfWork 
{ 
} 

테스트 결과 다음과 같이 표시됩니다.

when creating new clinic 

» '버스 클리닉 create 명령을 보내야합니다'버스 클리닉 명령을 생성 (FAIL)

테스트를 보내야 실패 Moq.MockException : 모의에 예상 호출 정확히 1 시간 만이었다 0 번 : B => b.Send

Configured setups: 
b => b.Send<CreateClinicCmd>(when_creating_new_clinic.cmd), Times.Never 

Performed invocations: 
IDomainCommandSender.Send(ArReg.Commands.CreateClinicCmd) 
IUnitOfWork.Commit() 
at Moq.Mock.ThrowVerifyException(MethodCall expected, IEnumerable`1 setups, IEnumerable`1 actualCalls, Expression expression, Times times, Int32 callCount) 
at Moq.Mock.VerifyCalls(Interceptor targetInterceptor, MethodCall expected, Expression expression, Times times) 
at Moq.Mock.Verify[T](Mock mock, Expression`1 expression, Times times, String failMessage) 
at Moq.Mock`1.Verify(Expression`1 expression, Times times) 
Repositories\when_creating_new_clinic.cs(51,0): at ArReg.Tests.Specs.Repositories.when_creating_new_clinic.<.ctor>b__4() 
at Machine.Specifications.Model.Specification.InvokeSpecificationField() 
at Machine.Specifications.Model.Specification.Verify() 

0 전달 (when_creating_new_clinic.cmd), 1, 0 스킵 실패 3.58 초 (Machine.Specifications 0.4.24-f7fb6b5)를했다.

Send() 명령은 IDomainCommandSender에 선언되어 있으므로 정확한 호출을 확인할 수 있도록 테스트를 어떻게 설정해야합니까?

감사합니다.

+2

이 경우 어디에서 시작해야할지 모르겠습니다. 명령을 보내기 위해 버스에 전화를 걸고있는 저장소 ... 정말로? 기본 사항을 다시 읽고 싶을 수도 있습니다. –

+0

도메인 저장소가 아닙니다. 코드 스 니펫은 불완전한 구현에서 온 것입니다. 이벤트 소스/도메인 측은 아직 구현되지 않았습니다. 명령 처리기가 현재 읽기 전용으로 쓰고 있습니다. 저장소에주의하지 마십시오. –

답변

3

버스 - moq 설정에 약간의 실수가 있습니다. 그것은 다음과 같이해야합니다 :

bus.Setup(b => b.Send(It.IsAny<CreateClinicCmd>())); 

이유 : 당신은 두 개의 코드 라인 위에서 생성 CreateClinicCmd의 인스턴스로 설정을 썼다. 테스트중인 클래스의 클래스 ClinicModelRepository에서 해당 클래스의 다른 인스턴스를 만들고 버스 모의를 호출합니다. 이 통화는 설정에서 작성한 통화와 일치하지 않습니다.

+0

이것은 의미가 있습니다, 감사합니다! –