使用响应对象的模拟进行单元测试

问题描述 投票:0回答:1

我有一项服务;该服务使用 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,并且不建立模拟值。他们有解决这个问题的办法吗?

c# unit-testing servicestack
1个回答
0
投票

我已经成功解决了我遇到的问题,解决方案如下:


    [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);
        ......
    }

希望对你有用。

© www.soinside.com 2019 - 2024. All rights reserved.