2017-08-15 39 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执行将封装的实际功能,并应在组合物根注册。