Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 测试-.net核心3_C#_.net Core_Dependency Injection_.net Core 3.0 - Fatal编程技术网

C# 测试-.net核心3

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

我正在.NETCore3(我的第一个)中创建一个RESTAPI。在那个API中,我做了一个从一些API方法调用的dll。 我想在该dll上编写一些测试,但在某些依赖项注入和获取API ConfigureServices中设置的值方面存在一些问题。我的主要问题是使用IHttpClientFactory按名称获取HttpClient

我的架构是:

  • 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谢谢你的回答,但你能更准确一点吗?