单元测试WebApi控制器,调用返回类型为void和Moq的异步方法
问题描述:
我有一个控制器调用返回类型为void的方法。我也在嘲笑该方法是使用Moq的成员。有没有一种特殊的方法来设置一个具有返回类型为void的方法的模拟?我目前做的是这样的:单元测试WebApi控制器,调用返回类型为void和Moq的异步方法
_mockClient.Setup(m => m.MyMethod(It.IsAny<int>())).Verifiable();
客户端界面是这样的:
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);
}
}
我收到的错误是“对象引用未设置为对象的实例。”我只在返回类型为void的方法上遇到这个问题。该方法对于实时数据没有任何问题,这只是Mocks和单元测试的一个问题。最终,我只是想验证这个调用返回一个OK HttpStatus。
答
MyMethod
由于它在所提供的示例中正在等待,所以似乎返回Task
。
嘲笑的方法很可能需要返回Task
以便允许await
流动完成。
_mockClient.Setup(m => m.MyMethod(It.IsAny<int>()))
.Returns(Task.FromResult((object)null))
.Verifiable();
嘲笑你的控制器没有多少意义。你究竟在测试什么?通常你会嘲笑注入的依赖关系,但是为真实运行控制器。 – Crowcoder
嘲笑的方法很可能需要返回一个任务,以便等待流程 – Nkosi
请创建一个实际重现问题的[mcve]。如果'Client.MyMethod()'抛出一个NullReferenceException异常,那么'Client'为null或者MyMethod()所依赖的某个值。你的问题也没有显示。 – CodeCaster