我有一个控制器,它调用返回类型为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。
答案 0 :(得分:2)
MyMethod
似乎返回Task
,因为在提供的示例中正在等待它。
模拟方法很可能需要返回Task
,以便await
能够流向完成。
_mockClient.Setup(m => m.MyMethod(It.IsAny<int>()))
.Returns(Task.FromResult((object)null))
.Verifiable();