2017-08-15 37 views
-1

我目前有一個函數可以創建一個響應數組。正如你可以在我的代碼中看到樓下我運行Task.WhenAll這會抓住每一個對象在我arrayOfRequests並通過我的FunctionThatCreatesResponse運行它返回的arrayOfRequests爲EACH對象響應如何Moq 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 
} 

我怎麼能嘲笑task.WhenAll()返回定義arrayOfResponses預?

東西線沿線的:

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執行將封裝的實際功能,並應在組合物根註冊。