Gobelet
Gobelet

Reputation: 483

Tests - .net core 3

I'm creating a Rest API in .net core 3 (my first one). In that API I did a dll that I call from some API methods. I want to write some tests on that dll but I have some issues with some dependency injection and getting values set in API ConfigureServices. My main problem is to get an HttpClient by name with a IHttpClientFactory.

My architecture is :

Here is my ConfigureServices :

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));
}

My class in 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();
        }
}

I tried different method (moq, Substitute, ...) and the closest I got from my goal was this one below but it doesn't find the HttpClient by name :

public void GetCredentials()
{
    var httpClientFactoryMock = Substitute.For<IHttpClientFactory>();
    var service = new dllClass(httpClientFactoryMock);
    var result = service.GetCredentials().Result;
}

How should I write that test ?

Thank you for your help

Upvotes: 0

Views: 85

Answers (1)

Kiksen
Kiksen

Reputation: 1767

As the Comment states. You haven't mocked the CreateClient method. It should look something like the following:

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;
}

Then you need to setup your HttpClient to point at whatever url you want to test.

Upvotes: 2

Related Questions