Как интегрировать тестирование контроллера, который внутри этого контроллера, методы получает токен с другого сайта - PullRequest
2 голосов
/ 26 июня 2019

Я настраиваю API, который аутентифицируется на другом сервере через JWT. один из методов контроллера, который я хочу протестировать, получает токен с внешнего сайта. как я могу проверить этот метод?

Я создал тестовый сервер и попытался имитировать действие веб-сайта, которое предоставляет tokens.i доступ к этому Test Server с помощью методов тестирования, но я не могу получить доступ к нему с фактического контроллера.

вот мой метод установки тестового сервера MockedController - это контроллер, который должен обеспечивать ток, и он работает нормально, и я могу получить токены из тестовых модулей. AuthController - это контроллер, который должен проверяться.

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

Вот метод испытания, который не работает

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

Вот код метода входа AuthController

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

вот код AuthService, который вызывается из 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;
}

дополнительная информация. Метод тестирования для макета контроллера работает нормально. Кажется, проблема во втором шаге использования макета контроллера. первый шаг работает отлично. Я имею в виду, что на первом шаге я могу получить доступ к проверенному контроллеру из тестового модуля, но когда я пытаюсь получить к нему доступ через главный контроллер (AuthController), я не могу получить к нему

1 Ответ

2 голосов
/ 26 июня 2019

Ваш код слишком тесно связан с проблемами реализации для того, чтобы компоненты могли быть смоделированы, чтобы изолировать его от сторонних зависимостей.Поскольку HttpClient создается вручную, нет способа заменить его обработчик для фальсификации запросов.

Рассмотрите возможность посмешища самой службы аутентификации, которая вводится в тестируемый контроллер.

For example

//...

var token = "{fake token here}";
var authService = Mock.Of<IAuthService>(_ =>
    _.GetAuthenticationTokenAsync == Task.FromResult(token)
);

config.AddSingleton<IAuthService>(authService);

//...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...