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.
4

2 に答える 2

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。これは、明示的なインターフェイスの実装とは関係なく、非同期テストを記述するだけです。

于 2016-06-21T15:50:44.103 に答える
2

これを試して

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

インターフェイスを明示的に実装する理由はたくさんあります

または

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

を使用できるようにするには、少なくとも xUnit.net 1.9 を使用する必要がありますasync。下位バージョンを使用している場合は、これを使用する必要があります。

[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();
}
于 2016-06-21T15:50:43.360 に答える