C# 测试-.net核心3
我正在.NETCore3(我的第一个)中创建一个RESTAPI。在那个API中,我做了一个从一些API方法调用的dll。 我想在该dll上编写一些测试,但在某些依赖项注入和获取API ConfigureServices中设置的值方面存在一些问题。我的主要问题是使用IHttpClientFactory按名称获取HttpClient 我的架构是:C# 测试-.net核心3,c#,.net-core,dependency-injection,.net-core-3.0,C#,.net Core,Dependency Injection,.net Core 3.0,我正在.NETCore3(我的第一个)中创建一个RESTAPI。在那个API中,我做了一个从一些API方法调用的dll。 我想在该dll上编写一些测试,但在某些依赖项注入和获取API ConfigureServices中设置的值方面存在一些问题。我的主要问题是使用IHttpClientFactory按名称获取HttpClient 我的架构是: WebApi项目 dllApi项目 项目测试 以下是我的配置服务: public void ConfigureServices(IServiceCol
- WebApi项目
- dllApi项目
- 项目测试
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddHttpClient("csms", c =>
{
c.BaseAddress = Configuration.GetValue<Uri>("ExternalAPI:CSMS:Url");
});
services.AddSingleton(typeof(IdllClass), typeof(dllClass));
}
public void配置服务(IServiceCollection服务)
{
services.AddControllers();
services.AddHttpClient(“csms”,c=>
{
c、 BaseAddress=Configuration.GetValue(“ExternalAPI:CSMS:Url”);
});
AddSingleton(typeof(IdllClass),typeof(dllClass));
}
我的类在dll中
public class dllClass
{
private readonly IHttpClientFactory ClientFactory;
public dllClass(IHttpClientFactory clientFactory)
{
ClientFactory = clientFactory;
}
public async Task<Credentials> GetCredentials()
{
var request = new HttpRequestMessage(HttpMethod.Get, $"Security/GetCredentials");
using (var client = ClientFactory.CreateClient("csms"))
{
var response = await client.SendAsync(request);
}
return new Credentials();
}
}
公共类dllClass
{
私有只读IHttpClientFactory客户端工厂;
公共dllClass(IHttpClientFactory客户端工厂)
{
ClientFactory=ClientFactory;
}
公共异步任务GetCredentials()
{
var request=newhttprequestmessage(HttpMethod.Get,$“Security/GetCredentials”);
使用(var client=ClientFactory.CreateClient(“csms”))
{
var response=wait client.sendaync(请求);
}
返回新凭据();
}
}
我尝试了不同的方法(moq、Substitute等),与我的目标最接近的是下面这个方法,但它没有按名称找到HttpClient:
public void GetCredentials()
{
var httpClientFactoryMock = Substitute.For<IHttpClientFactory>();
var service = new dllClass(httpClientFactoryMock);
var result = service.GetCredentials().Result;
}
public void GetCredentials()
{
var httpClientFactoryMock=Substitute.For();
var服务=新的dllClass(httpClientFactoryMock);
var result=service.GetCredentials().result;
}
我应该如何编写该测试
如评论所述,感谢您的帮助。您尚未模拟CreateClient方法。它应该如下所示:
public void GetCredentials()
{
var httpClientFactoryMock = Substitute.For<IHttpClientFactory>();
var csmsTestClient = new HttpClient();
httpClientFactoryMock.CreateClient("csms").Returns(csmsTestClient)
var service = new dllClass(httpClientFactoryMock);
var result = service.GetCredentials().Result;
}
public void GetCredentials()
{
var httpClientFactoryMock=Substitute.For();
var csmsTestClient=new HttpClient();
httpClientFactoryMock.CreateClient(“csms”).Returns(csmsTestClient)
var服务=新的dllClass(httpClientFactoryMock);
var result=service.GetCredentials().result;
}
然后,您需要将您的HttpClient设置为指向要测试的任何url。如注释所示。您尚未模拟CreateClient方法。它应该如下所示:
public void GetCredentials()
{
var httpClientFactoryMock = Substitute.For<IHttpClientFactory>();
var csmsTestClient = new HttpClient();
httpClientFactoryMock.CreateClient("csms").Returns(csmsTestClient)
var service = new dllClass(httpClientFactoryMock);
var result = service.GetCredentials().Result;
}
public void GetCredentials()
{
var httpClientFactoryMock=Substitute.For();
var csmsTestClient=new HttpClient();
httpClientFactoryMock.CreateClient(“csms”).Returns(csmsTestClient)
var服务=新的dllClass(httpClientFactoryMock);
var result=service.GetCredentials().result;
}
然后,您需要将您的HttpClient设置为指向您想要测试的任何url。
httpClientFactoryMock.CreateClient(“csms”).Returns(您的HttpClientFortests)
@Fabio谢谢您的回答,但您能更精确一点吗?httpClientFactoryMock.CreateClient(“csms”).Returns(您的HttpClientFortests)
@Fabio谢谢你的回答,但你能更准确一点吗?