2017-08-15 3 views
-1

私は現在応答の配列を作成する関数があります。あなたは私のコードで見ることができるように、私はTask.WhenAllを実行していますダウンの下にこれは私のarrayOfRequests内の各オブジェクトを取得し、arrayOfRequestsでEACHオブジェクトに対する応答を返す私のFunctionThatCreatesResponseを通してそれを実行しますどのようにMoq a Task.WhenAll()

var arrayOfRequests = new [] { RequestObject1, RequestObject2, RequestObject3 } 
var arrayOfResponses = await Task.WhenAll(arrayOfRequests.Select(req => FunctionThatCreatesResponse(req))); 

private async Task<ResponseObject> FunctionThatCreatesResponse(RequestObject req) 
{ 
    // The response will be created here and returned 
} 

にはどうすればarrayOfResponsesを定義し、事前に戻すためにtask.WhenAll()を模擬することができますか?

の線に沿って何か:

var task = new Mock<Task>(); 
task.Setup(t => t.WhenAll()).ReturnsAsync(arrayOfResponses); 
+0

Task.FromResultはオプションですか? –

+0

@SirRufoどうしたのですか?あなたの思考の列車の例を教えてください。 – Lostaunaum

+1

テスト中のコードをさらに表示する必要がありますが、今はテストで何をしようとしているのか分かりません。例えば、RequestObject1、RequestObject2、RequestObject3がどこから来たのか、あるいは 'arrayOfResponses'自体を模倣する必要があるかどうかを示す必要があります。それはあなたが模擬するのに必要な場所であり、仕事ではありません。 –

答えて

0

FunctionThatCreatesResponseや、これまでどのようなその関数内では、タスクからの復帰を模擬することができるようにさらされる必要があるものです。 Task.WenAllは、一度正しいデータが提供されるとその設計された機能を実行します。

コメントをもとに、あなたはまた、その関数内でのみ呼び出される内部メソッドであること

を示しました。

オプションは、望ましい機能を公開することです。

//A single responsibility abstraction 
public interface IClient { 
    Task<ResponseObject> CreatesResponse(RequestObject req); 
} 

public class ExampleClass { 
    private readonly IClient client; 

    public ExampleClass(IClient client) { 
     this.client = client; 
    } 

    public async Task<ResponseObject[]> GetResponses(RequestObject[] arrayOfRequests){ 
     var arrayOfResponses = await Task.WhenAll(arrayOfRequests 
      .Select(req => client.CreatesResponse(req))); 
     return arrayOfResponses; 
    } 
} 

は、だから今テスト中の被写体がリファクタリングされたことを、テスト対象のメソッドを行使することができ、その挙動は主張しました。

public async Task ExampleClass_GetResponses_Should_Return_ResponseArray() { 
    //Arrange 
    var factoryMock = new Mock<IClient>(); 
    factoryMock.Setup(_ => _.CreatesResponse(It.IsAny<RequestObject>())) 
       .Returns(() => Task.FromResult(new ResponseObject())); 

    var sut = new ExampleClass(factoryMock.Object); 
    var arrayOfRequests = new [] { RequestObject1, RequestObject2, RequestObject3 }; 

    //Act 
    var actual = await sut.GetResponses(arrayOfRequests); 

    //Assert 
    Assert.IsNotNull(actual); 
    //...assert desired behavior 
} 

IClientの実装では、実際の機能をカプセル化するであろうと合成ルートに登録されなければなりません。

関連する問題