У меня есть проект тестирования интеграции, который добавлен в большое решение для бэк-офиса, в котором есть два основных проекта 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 без одобрения кого-то другого, и даже если мне это не нужно, я, честно говоря, понятия не имею, как или что можно изменить, чтобы решить эту проблему. Я много дней об этом говорю, и я действительно не нашел ничего, что могло бы помочь мне решить или даже объяснить, почему это работает для одного проекта и не для другого.
Любая помощь будетбыть очень ценным. Заранее спасибо.