我有这段代码要在其上创建单元测试,对此我还很陌生。所以我只需要一些有关如何开始的指导?
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);
}
}
我可以测试响应代码,但是即使我决定创建一个模拟游戏,也很困惑我应该为会话输入什么样的信息?请指导我如何传递会话变量
答案 0 :(得分:1)
session
变量的内容是您最少的担心。如果我对单元测试和模拟还“陌生”,那么不是将会是我选择学习的代码。静态方法调用与循环复杂性(包括对问题中未给出的对其他方法的调用)之间的紧密耦合将使这一过程变得非常棘手。
例如,要测试这一点,您将需要提供真正必须响应http请求的内容的URI。这是integration testing,很有价值,但与带有模拟的单元测试(在问题上标记)不同。
请考虑重构代码,以将您的关注点分解为较小的责任。测试这些部件中的每个部件是否都能正常工作,并Verify
(使用模拟对象)确保部件正确地插入在一起。