모델 저장소를 테스트하여 메시지 버스를 호출하는지 확인했습니다. 이것은 좋은 테스트가 아닌지 잘 모르겠다.하지만 내 생각은 다음과 같다. 보통 컨트롤러에 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에 선언되어 있으므로 정확한 호출을 확인할 수 있도록 테스트를 어떻게 설정해야합니까?
감사합니다.
이 경우 어디에서 시작해야할지 모르겠습니다. 명령을 보내기 위해 버스에 전화를 걸고있는 저장소 ... 정말로? 기본 사항을 다시 읽고 싶을 수도 있습니다. –
도메인 저장소가 아닙니다. 코드 스 니펫은 불완전한 구현에서 온 것입니다. 이벤트 소스/도메인 측은 아직 구현되지 않았습니다. 명령 처리기가 현재 읽기 전용으로 쓰고 있습니다. 저장소에주의하지 마십시오. –