2017-09-26 17 views
0

戻り値の型がvoidのメソッドを呼び出すコントローラがあります。私はまた、そのメソッドがMoqを使用しているメンバーであるというオブジェクトを嘲笑しています。戻り値の型がvoidのメソッドでモックを設定する特別な方法はありますか?ユニットテスト空の戻り値の型とMoqを使用して非同期メソッドを呼び出すWebApiコントローラ

_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を返すようです。

模擬方法はawaitが完了するようにTaskを返す必要があります。

_mockClient.Setup(m => m.MyMethod(It.IsAny<int>())) 
      .Returns(Task.FromResult((object)null)) 
      .Verifiable(); 
関連する問題