如何对方法进行单元测试

时间:2018-07-13 20:53:46

标签: c# asp.net-mvc mocking xunit

我有这段代码要在其上创建单元测试,对此我还很陌生。所以我只需要一些有关如何开始的指导?

 public async Task<Response<TResult>> CallAuthenticatedApi<TRequest, TResult>(
        HttpMethod method,
        string uri,
        string[] scope,
        HttpSessionStateBase session,
        TRequest content = default(TRequest))
    {
        _logger.Information($"Making a call: {method} to {uri}");

        var stringContent = new StringContent(JsonConvert.SerializeObject(content),
            Encoding.UTF8, "application/json");

        var authToken = await GetAuthenticationToken(scope, session);

        var response = await RetryHelper.RetryOnExceptionAsync<HttpRequestException>(async () =>
        {
            var request = CreateRequestMessage(method, uri, stringContent, authToken);
            var response1 = await HttpClient.SendAsync(request);
            return response1;
        });

        switch (response.StatusCode)
        {

            case HttpStatusCode.Unauthorized:
                _logger.Warning("User is unauthenticated");
                return new Response<TResult>(default(TResult),
                    response.StatusCode);



            default:
                var errorContent = await response.Content.ReadAsStringAsync();
                _logger.Error("General failure when calling API! " +
                              $"Content: {errorContent}");
                return new Response<TResult>(default(TResult),
                    response.StatusCode);
        }
    }

我可以测试响应代码,但是即使我决定创建一个模拟游戏,也很困惑我应该为会话输入什么样的信息?请指导我如何传递会话变量

1 个答案:

答案 0 :(得分:1)

session变量的内容是您最少的担心。如果我对单元测试和模拟还“陌生”,那么不是将会是我选择学习的代码。静态方法调用与循环复杂性(包括对问题中未给出的对其他方法的调用)之间的紧密耦合将使这一过程变得非常棘手。

例如,要测试这一点,您将需要提供真正必须响应http请求的内容的URI。这是integration testing,很有价值,但与带有模拟的单元测试(在问题上标记)不同。

请考虑重构代码,以将您的关注点分解为较小的责任。测试这些部件中的每个部件是否都能正常工作,并Verify(使用模拟对象)确保部件正确地插入在一起。