单元测试WebApi控制器,它调用返回类型为void和Moq的异步方法

时间:2017-09-26 11:01:49

标签: c# unit-testing asp.net-web-api moq void

我有一个控制器,它调用返回类型为void的方法。我也在嘲笑方法是使用Moq的成员的对象。是否有一种特殊的方法来设置一个返回类型为void的方法的mock?我目前正在做这样的事情:

public interface IMyClient
{
    Task MyMethod(int i);
}

客户端界面如下:

public async Task DeleteNavMenuAsync_ReturnsOk()
{
    MyController = new MyController(_mockClient.Object);

    //TODO: This is always returning a 500, not sure why.
    IHttpActionResult actionResult = await MyController.DeleteNavMenuAsync(6);

    _mockClient.Verify(m => m.MyMethod(It.IsAny<int>()),Times.Once());
    Assert.IsNotNull(actionResult as OkResult);
}

这是实际的单元测试:

public async Task<IHttpActionResult> DeleteNavMenuAsync(int navMenuId)
{
    try
    {
        await Client.MyMethod(navMenuId); //Errors here
        return Ok();
    }
    catch (Exception e)
    {
        return HandleException(e);
    }
}

以下是测试中的实际控制器方法:

sp_deleteLineItemCtnrByDomain
-- Description : This procedure deletes basket/order related stuff.
-- Input       : domainID   The domain id of the domain to be deleted.
-- Output      : none
-- Example     : exec sp_deleteLineItemCtnrByDomain(domainid)

我收到的错误是&#34;对象引用未设置为对象的实例。&#34;我对返回类型为void的方法只有这个问题。该方法对实时数据没有任何问题,它只是模拟和单元测试的问题。最后,我只想验证调用是否返回Ok HttpStatus。

1 个答案:

答案 0 :(得分:2)

MyMethod似乎返回Task,因为在提供的示例中正在等待它。

模拟方法很可能需要返回Task,以便await能够流向完成。

_mockClient.Setup(m => m.MyMethod(It.IsAny<int>()))
           .Returns(Task.FromResult((object)null))
           .Verifiable();