. net тест интеграции ядра веб-API вызывает сам себя - PullRequest
0 голосов
/ 06 мая 2020

Я создал следующий веб-контроллер api специально для написания некоторых интеграционных тестов, которые будут проверять, что политики повтора и автоматического выключателя, которые я определил для HttpClient с помощью Polly.

Если я запускаю приложение и вручную вызываю конечную точку / polly с правильными аргументами, все работает нормально, но когда я запускаю свой интеграционный тест, выполняя то же самое, он терпит неудачу с 404.

Is есть какой-то особый случай с тестами интеграции ядра. net, когда одна конечная точка не может вызвать другую? Или какая-то конкретная переменная среды c, которую мне нужно отключить, чтобы управлять URL-адресом, как я делаю ниже для Docker?

В этом коде конечная точка / polly должна вызывать конечную точку / parrot, но Я получаю ошибку 404 not found при выполнении этого с помощью интеграционного теста.

Я пробовал установить относительный URL-адрес, например / api / errorsimulation / parrot? StatusCode = 502, но я все равно получаю 404 во время интеграции тест.

Мысли?

namespace MyApp.API.Controllers
{
    [Produces("application/json")]
    [Route("api/[controller]")]
    [ApiController]
    public class ErrorSimulationController : ControllerBase
    {
        private readonly ITestService _testService;

        private bool InDocker { get { return Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true"; } }

        public ErrorSimulationController(ITestService testService)
        {
            _testService = testService;
        }

        /// <summary>
        /// Allows integration tests to test the various polly policies for retries and circuit breakers.
        /// </summary>
        /// <param name="statusCode">The status code to simulate during the http call.</param>
        /// <returns>Task&lt;ActionResult&lt;System.Boolean&gt;&gt;.</returns>
        [HttpPost]
        [Route("polly")]
        public async Task<ActionResult<HttpResponseMessage>> Polly(int statusCode)
        {
            var protocol = Request.IsHttps ? "https" : "http";
            var host = Request.Host.ToString();
            if (InDocker)
            {
                // don't include the port if in docker
                host = Request.Host.Host;
            }
            var response = await _testService.Get($"{protocol}://{host}/api/errorsimulation/parrot?statusCode={statusCode}").ConfigureAwait(false);
            return StatusCode((int)response.StatusCode);
        }

        /// <summary>
        /// Returns the specified status code.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <returns>Task&lt;ActionResult&lt;HttpResponseMessage&gt;&gt;.</returns>
        [HttpGet]
        [Route("parrot")]
        public async Task<ActionResult<HttpResponseMessage>> Parrot(int statusCode)
        {
            return StatusCode(statusCode);
        }
    }
}
...