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

C# 单元测试调用返回类型为void和Moq的异步方法的WebApi控制器,c#,unit-testing,asp.net-web-api,moq,void,C#,Unit Testing,Asp.net Web Api,Moq,Void,我有一个控制器,它调用一个返回类型为void的方法。我还模拟了该方法是使用Moq的成员的对象。有没有一种特殊的方法可以使用返回类型为void的方法来设置mock?我目前正在做这样的事情: _mockClient.Setup(m => m.MyMethod(It.IsAny<int>())).Verifiable(); 下面是实际的单元测试: public async Task DeleteNavMenuAsync_ReturnsOk() { MyController

我有一个控制器,它调用一个返回类型为void的方法。我还模拟了该方法是使用Moq的成员的对象。有没有一种特殊的方法可以使用返回类型为void的方法来设置mock?我目前正在做这样的事情:

_mockClient.Setup(m => m.MyMethod(It.IsAny<int>())).Verifiable();
下面是实际的单元测试:

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异步任务DeleteNavMenuAsync_ReturnsOk()
{
MyController=新的MyController(_mockClient.Object);
//TODO:这总是返回500,不知道为什么。
IHttpActionResult actionResult=等待MyController.DeleteNavMenuAsync(6);
_mockClient.Verify(m=>m.MyMethod(It.IsAny()),Times.Once());
Assert.IsNotNull(actionResult作为OkResult);
}
以下是测试中的实际控制器方法:

public async Task<IHttpActionResult> DeleteNavMenuAsync(int navMenuId)
{
    try
    {
        await Client.MyMethod(navMenuId); //Errors here
        return Ok();
    }
    catch (Exception e)
    {
        return HandleException(e);
    }
}
public异步任务DeleteNavMenuAsync(int-navMenuId)
{
尝试
{
等待Client.MyMethod(navMenuId);//此处有错误
返回Ok();
}
捕获(例外e)
{
返回句柄异常(e);
}
}

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

MyMethod
似乎返回了一个
任务,因为在所提供的示例中它正在等待


模拟方法很可能需要返回一个
任务
,以允许
等待
流程完成

_mockClient.Setup(m => m.MyMethod(It.IsAny<int>()))
           .Returns(Task.FromResult((object)null))
           .Verifiable();
\u mockClient.Setup(m=>m.MyMethod(It.IsAny()))
.Returns(Task.FromResult((对象)null))
.可验证();

模拟您的控制器没有多大意义。你到底在测试什么?通常,您将模拟注入的依赖项,但实际运行控制器。模拟的方法很可能需要返回一个任务,以便允许等待流程。请创建一个实际再现问题的。如果
Client.MyMethod()
抛出一个NullReferenceException,则
Client
为null,或者是
MyMethod()
依赖的某个值。您的问题中都没有显示。没有NullReferenceException,这不是问题的根本原因。我建议删除“标记为重复”的链接,因为提供的链接无法提供问题的答案。我的评论不会改变。你的问题没有包含一个答案。
_mockClient.Setup(m => m.MyMethod(It.IsAny<int>()))
           .Returns(Task.FromResult((object)null))
           .Verifiable();