Ошибка 403 в одном из двух API в интеграционных тестах - PullRequest
2 голосов
/ 16 октября 2019

У меня есть проект тестирования интеграции, который добавлен в большое решение для бэк-офиса, в котором есть два основных проекта API, которые мне нужно протестировать. Я пытался использовать HttpClientFactory и TestServer или WebApplicationFactory, но оба дают одинаковые результаты.

Startup.cs проекта API, который не работает, таков:

public class Startup
{
    private IConfiguration Configuration { get; }
    private IHostingEnvironment CurrentEnvironment { get; set; }

    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        Configuration = new ConfigurationBuilder()
              .AddEnvironmentVariables()
              .BuildWithSettings(env);

        CurrentEnvironment = env;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromMinutes(2);
            options.Cookie.HttpOnly = true;
        });

        services.AddLogging(builder =>
        {
            builder.SetMinimumLevel(LogLevel.Trace);
            builder.AddGelf(options =>
            {
                options.Host = Graylog.Hostname;
                options.Port = Graylog.Port;
                options.LogSource = "Project2.Payment";
            });
            builder.AddFilter("Microsoft", LogLevel.None);
            builder.AddFilter("System", LogLevel.None);
            builder.AddFilter("Engine", LogLevel.None);
        });

        services.Configure<RequestLocalizationOptions>(options =>
        {
            var supportedCultures = new[]
            {
                new CultureInfo("pt-BR"),
            };

            options.DefaultRequestCulture = new RequestCulture("pt-BR");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;

        });

        Configuration.GetSection("EnvironmentConfiguration").Get<EnvironmentConfiguration>().Initialize(CurrentEnvironment.EnvironmentName);

        services.AddHttpContextAccessor();
        services
            .AddMvc()
            .AddJsonOptions(opt =>
            {
                opt.SerializerSettings.ContractResolver = new DefaultContractResolver();
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
            app.UseDeveloperExceptionPage();
        else
            app.UseHsts();


        app.UseCors(builder =>
        {
            builder.AllowAnyOrigin()
                    .AllowAnyHeader()
                    .WithMethods("POST", "GET", "DELETE", "PUT");
        });

        app.UseSession();
        app.UseHttpsRedirection();
        app.UseCoreAuthenticationS2P();
        app.UseMvc();
    }
}

Все тесты для одного из API работают нормально, но все тесты для другого API дают мне один и тот же результат: исключение "Ссылка на объект не установлена ​​для экземпляра объекта" в этой точке маршрутапроверено:

private IHttpContextAccessor accessor;
//...
if (string.IsNullOrWhiteSpace(transaction.IpAddress))
{
    transaction.IpAddress = objectToProcess.HttpContext.Connection.RemoteIpAddress.ToString();
}

Пытаясь изменить RemoteIpAddress на RemoteIpAddress?, при получении в этот момент запроса мне дается The remote server returned an error: (403) Ip Forbidden:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    if (response.StatusCode == HttpStatusCode.OK)
    {
        string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
        responseObject = JsonConvert.DeserializeObject(responseString);
    }
}

TestServerпостроен очень простым способом для TestSetup класса:

[OneTimeSetUp]
public void SetUp()
{
    var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";

    //This one works fine

    _testServer1 = new TestServer(WebHost.CreateDefaultBuilder()
        .UseStartup<Project1.Startup>()
        .UseEnvironment(environment));

    _client1 = _testServer1.CreateClient();
    _client1.DefaultRequestHeaders.Add(tokenType, apiToken);

    //This one DOESN'T!

    _testServer2 = new TestServer(WebHost.CreateDefaultBuilder()
        .UseStartup<Project2.Startup>()
        .UseEnvironment(environment));

    _client2 = _testServer2.CreateClient();
    _client2.DefaultRequestHeaders.Add(tokenType, apiToken);
}

Моя главная проблема в том, что либо я новичок в этом виде тестирования, и я действительно не знаю, как мне решитьэта проблема, но также и то, что я не могу вносить изменения в проекты API без одобрения кого-то другого, и даже если мне это не нужно, я, честно говоря, понятия не имею, как или что можно изменить, чтобы решить эту проблему. Я много дней об этом говорю, и я действительно не нашел ничего, что могло бы помочь мне решить или даже объяснить, почему это работает для одного проекта и не для другого.

Любая помощь будетбыть очень ценным. Заранее спасибо.

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