我在ConfigureServices
方法中有这个:
services.AddHttpClient("ClientUsingCredentials")
.ConfigurePrimaryHttpMessageHandler(() =>
{
var credentials = new NetworkCredential("someUsername", "somePassword");
return new HttpClientHandler()
{
// UseDefaultCredentials = true,
Credentials = credentials
};
});
现在,我的服务看起来像这样:
public class WebAppService : IWebAppService
{
private readonly ILogger<WebAppService> _logger;
private readonly IHttpClientFactory _httpClientFactory;
public WebAppService(ILogger<WebAppService> logger, IHttpClientFactory httpClientFactory)
{
_logger = logger;
_httpClientFactory = httpClientFactory;
}
public async Task<WebAppReport> CheckWebSiteWithCredentialsAsync(string someUrlThatNeedsCredentials)
{
WebAppReport report = new();
try
{
using (var client = _httpClientFactory.CreateClient("ClientUsingCredentials"))
{
var result = await client.GetAsync(someUrlThatNeedsCredentials);
if (result.IsSuccessStatusCode)
{
// Do something with the result
report.IsCheckSuccessful = true;
}
else
{
// Set report fields accordingly
}
}
}
catch (Exception ex)
{
_logger.LogError(ex, $"Something went wrong while checking the website: '{someUrlThatNeedsCredentials}'.");
// Set report fields accordingly
}
return report;
}
}
WebAppReport
类:
public class WebAppReport
{
public bool IsCheckSuccessful { get; set; }
//Some other fields here
}
是否有一种方法为这个服务方法编写单元测试,也检查它在发送请求时通过正确的凭据?
编辑:我看到@Nkosi的回答说单元测试在这种情况下是不可能的。那么,你能给我举个例子来做集成测试吗?我是否应该在我的测试方法中使用new ServiceCollection()
创建服务,以与ConfigureServices
方法相同的方式添加服务,设置正确的credentials
等等?我希望看到你的例子在上面。
谢谢!
是否有一种方法可以为该方法编写单元测试,该方法还可以检查它在发送请求时是否通过正确的凭据?
简短回答:不。不在单元测试中.
这是因为ConfigurePrimaryHttpMessageHandler
是一个框架横切关注点,仅在运行时创建将用于发出请求的实际客户端时由实际的HttpClientFactory
应用。
你基本上是在尝试测试HttpClientFactory实现将按照设计的方式运行。微软会在发布之前进行测试。
对于您的特定场景,理想情况下需要在集成测试中完成类似的事情.
为了测试你的WebAppService
,你应该把重点放在被测试主题的本地逻辑上。