mercredi 26 juin 2019

How to Integrate Testing a Controller, which inside that controller, methods gets token from another site

I'm setting up an API which it gets authenticated to another server through JWT. one of Controller's methods I want to test, gets the token from an external site. how can I test this method?

I made a Test server and tried to mimic the website action which providing tokens.i can access this Test Server through Test Methods but I can't get to it from the actual controller.

here is my Test Server setup method MockedController is the Controller supposed to provide toke and is working fine and I can get tokens from test units. AuthController is the Controller supposed to test.

var server = new TestServer(
                new WebHostBuilder()
                .UseEnvironment(TestConstants.EnvironmentName)
                .UseStartup<Startup>()
                .UseUrls(TestConstants.MockAddress)
                .ConfigureTestServices(config =>
                {
                    config.AddOptions();
                    config.AddMvc()
                       .SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_2_2)
                        .AddApplicationPart(typeof(AuthController).Assembly)
                        .AddApplicationPart(typeof(MockedTokenController).Assembly)
                        ;

                    config.AddSingleton<MockedTokenController>();
                    config.BuildServiceProvider();
                }));
            server.BaseAddress = new Uri(TestConstants.MockAddress);
            server.CreateHandler();
            _client = server.CreateClient();
            _client.BaseAddress = new Uri(TestConstants.MockAddress);// I tried with and without this line

Here is the test method which is failing

 var request = new HttpRequestMessage(HttpMethod.Get, "/Auth/Login");
            var response = await _client.SendAsync(request);
            var contents = await response.Content.ReadAsStringAsync();
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

Here is the AuthController Login Method code

[HttpGet("Login")]
public async Task<IActionResult> LoginAsync(){
         var token = await _authService.GetAuthenticationTokenAsync();
         return Ok(token);
}

here is the AuthService code which is called from AuthController

public async Task<string> GetAuthenticationTokenAsync(){
      HttpClient client = new HttpClient();
       var response = await client.SendAsync(request, 
       HttpCompletionOption.ResponseContentRead);
       response.EnsureSuccessStatusCode();
       var token = await response.Content.ReadAsStringAsync();
       return token;
}

extra information. test method for mocked controller works fine. it seems the problem is in second step usage of the mocked controller. the first step works fine. I mean I can access the mocked controller from Test unit at first step but when I try to access it through the Main controller(AuthController), I can't get to it

Aucun commentaire:

Enregistrer un commentaire