2017-09-26 110 views
0

我有一个控制器调用返回类型为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。

+0

嘲笑你的控制器没有多少意义。你究竟在测试什么?通常你会嘲笑注入的依赖关系,但是为真实运行控制器。 – Crowcoder

+0

嘲笑的方法很可能需要返回一个任务,以便等待流程 – Nkosi

+1

请创建一个实际重现问题的[mcve]。如果'Client.MyMethod()'抛出一个NullReferenceException异常,那么'Client'为null或者MyMethod()所依赖的某个值。你的问题也没有显示。 – CodeCaster

回答

1

MyMethod由于它在所提供的示例中正在等待,所以似乎返回Task

嘲笑的方法很可能需要返回Task以便允许await流动完成。

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