如何在Moq中模拟没有参数的方法并填写输出

时间:2014-08-08 15:01:18

标签: unit-testing nunit moq

我在Stackoverflow中看到了几个关于MOQ参数的问题,我的问题是如何填充这个参数:让代码:

[HttpPost]
public HttpResponseMessage Send(SmsMoRequest sms)
{
    if (sms == null)
        return Request.CreateResponse(HttpStatusCode.BadRequest);

    SmsMoResponse response;
    _messageService.Process(sms, out response);
    return Request.CreateResponse(HttpStatusCode.Created, response.ToString());
}

我想测试这篇文章:

[Test]
public void Should_Status_Be_Create_With_Valid_XML()
{
    // Arrange
    var messageServiceMoq = new Mock<IMessageService>();
    SmsMoResponse response;
    messageServiceMoq.Setup(mock => mock.Process(It.IsNotNull<SmsMoRequest>(), out response));
    _kernel.Bind<IMessageService>().ToConstant(messageServiceMoq.Object);
    var client = new HttpClient(_httpServer) { BaseAddress = new Uri(Url) };

    // Act
    using (var response = client.PostAsync(string.Format("Api/Messages/Send"), ValidContent()).Result)
    {
        // Asserts
        response.IsSuccessStatusCode.Should().BeTrue();
        response.StatusCode.Should().Be(HttpStatusCode.Created);
    }
}

问题

发送方法(POST)中的response对象用于帖子回复,但_messageService.Process负责填充response对象。 在测试方法Should_Status_Be_Create_With_Valid_XML中,我模拟_messageService.Processresponse对象在Null reference

中填充错误Request.CreateResponse(HttpStatusCode.Created, response.ToString());

response为空!

1 个答案:

答案 0 :(得分:1)

当然response为null,没有任何代码可以将它设置为任何代码(在您的服务方法或模拟中)。

由于您正在模拟通常会填充它的方法,因此指定它是如何设置的。您应该在调用Setup之前填写对象,并将期望的作为调用该方法时的值。

另外,请参阅此question了解详情。