2016-06-21 18 views
0

私はサービスで次のメソッドを持っていますが、私は単体テストで呼び出すことに失敗しています。このメソッドはasync/ awaitコードを使用していますが、私が問題を引き起こしていると考えているのは、ドット表記法の名前がありますが、これは正直なことがわかりません。テスト明示的なインターフェイス実装されたメソッドをユニット化する方法?

実装の下に私の例を参照してください

async Task<IEnumerable<ISomething>> IMyService.MyMethodToTest(string bla) 
{ 
    ... 
} 

ユニットテスト

[Fact] 
public void Test_My_Method() 
{ 
    var service = new MyService(...); 
    var result = await service.MyMethodToTest(""); // This is not available ? 
} 

更新

が提案を試みたが、それは次のエラーメッセージでコンパイルされません。

await operator can only be used with an async method. 
+0

IMyService.MyMethodToTestはMyMethodToTestが、それはまだ動作しませんが、あなたの助けをありがとう、私はエラーメッセージ –

答えて

2

この

var result = await ((IMyService)service).MyMethodToTest(""); 

を試してみてくださいあなたはasyncを使用できるようにするには、少なくともxUnit.net 1.9を使用する必要がありますimplementing an interface explicitly

それとも

[Fact] 
public async void Test_My_Method() 
{ 
    IMyService service = new MyService(...); 
    var result = await service.MyMethodToTest(""); 
} 

ためreasons多くがあります。あなたは下位バージョンを使用している場合は、これを使用する必要があります

[Fact] 
public void Test_My_Method() 
{ 
    IMyService service = new MyService(...); 
    var result = await service.MyMethodToTest(""); 
    Task task = service.MyMethodToTest("") 
      .ContinueWith(innerTask => 
      { 
       var result = innerTask.Result; 
       // ... assertions here ... 
      }); 

    task.Wait(); 
} 
4

はい、明示的なインターフェイスの実装しかない実装タイプ、インタフェース型の式に呼び出すことができます。

ちょうど最初のインターフェイスタイプにサービスをキャスト、または別の変数を使用します。

[Fact] 
public async Task Test_My_Method() 
{ 
    IMyService serviceInterface = service; 
    var result = await serviceInterface.MyMethodToTest(""); 
} 

それとも

個人的に
[Fact] 
public async Task Test_My_Method() 
{ 
    var result = await ((IMyService) service).MyMethodToTest(""); 
} 

を、私は前者の方法を好みます。

返品タイプがvoidからTaskに変更され、方法がasyncに変更されていることに注意してください。これは、明示的なインタフェースの実装とは無関係で、非同期テストを書くことに関するものです。

+0

の方法MyMethodToTestの実装であることを意味:まあはいしかし、それはまったく別の問題です。テストメソッドを非同期にする必要があります。私の答えは更新されますが、基本的に一度に1つの問題を調査する必要があります。 – Jamie

+0

@Jamieで私の質問を更新しましたインタフェースIMyService –

関連する問題