我有一项服务;该服务使用 Response (IResponse) 对象,这是服务的处理程序:
[LogRequestDto]
[LogResponseDto]
[RequiresAnyRole(Roles.EventWrite, Roles.EventAdmin)]
public NewEventResponse Post(NewEvent request)
{
long eventId;
try
{
......
}
catch (Exception)
{
throw new HttpError(HttpStatusCode.InternalServerError,
HttpErrorCodes.InternalServerError.ToString(), HttpErrorMessages.InternalServerError);
}
if (Response == null)
throw new HttpError(HttpStatusCode.BadRequest,
HttpErrorCodes.NotGenerateResponse.ToString(), HttpErrorMessages.NotGenerateResponse);
.......
Response.StatusCode = (int)HttpStatusCode.Created;
return new NewEventResponse
{
EventId = eventId,
.......
};
}
这是我的单元测试:
[Test, Order(1)]
public void NewEventTest_Successful()
{
// Arrange
var request = new NewEvent
{
... };
var eventData = new EventData().PopulateWithNonDefaultValues(request);
var eventId = new Random().NextInt64();
var eventManagerMock = new Mock<IEventManager>();
var requestContextMock = new Mock<RequestContext>();
var requestMock = new Mock<IRequest>();
eventManagerMock.Setup(x => x.CreateNewEvent(
It.Is<EventData>(y =>
y.Id.Equals(eventData.Id) &&
...........
y.Metadata.Zip(eventData.Metadata, (metaY, metaR) =>
metaY.Key == metaR.Key &&
metaY.Value == metaR.Value).All(result => result)
)
)).Returns(eventId)
.Verifiable("IEventManager.CreateNewEvent was not invoked.");
BaseAppHost.Container.Register(eventManagerMock.Object);
BaseAppHost.Container.Register(requestContextMock.Object);
BaseAppHost.Container.Register(requestMock.Object);
var service = BaseAppHost.Container.Resolve<EventServices>();
// Act
var response = service.Post(request);
// Assert
eventManagerMock.Verify();
}
但是在运行中,在代码段中:
if (Response == null)
throw new HttpError(HttpStatusCode.BadRequest,
HttpErrorCodes.NotGenerateResponse.ToString(), HttpErrorMessages.NotGenerateResponse);
响应对象始终为 null,并且不建立模拟值。他们有解决这个问题的办法吗?
我已经成功解决了我遇到的问题,解决方案如下:
[Test, Order(1)]
public void NewEventTest_Successful()
{
// Arrange
var request = new NewEvent
{...};
var eventData = new EventData().PopulateWithNonDefaultValues(request);
var eventId = new Random().Next();
var eventManagerMock = new Mock<IEventManager>();
var responseMock = new Mock<IResponse>();
var requestMock = new Mock<IRequest>();
requestMock.Setup(x => x.Response)
.Returns(responseMock.Object)
.Verifiable("IRequest.Response was not invoked.");
eventManagerMock.Setup(x => x.CreateNewEvent(
It.Is<EventData>(y => ..........)
)).Returns(eventId)
.Verifiable("IEventManager.CreateNewEvent was not invoked.");
BaseAppHost.Container.Register(eventManagerMock.Object);
BaseAppHost.Container.Register(requestMock.Object);
var service = BaseAppHost.Container.Resolve<EventServices>();
// Act
var response = service.Post(request);
// Assert
eventManagerMock.Verify();
requestMock.Verify();
responseMock.VerifySet(x => x.StatusCode = (int)HttpStatusCode.Created, Times.Once);
Assert.That(response, Is.Not.Null);
......
}
希望对你有用。