Testy XUnit - wczytywanie ASPNETCORE_ENVIRONMENT z pliku

0

Cześć.

Mam projekt z testami xUnit.
W testach potrzebuję odwołać się do pliku, który różni się zawartością w zależności od wybranej konfiguracji.

W głównym projekcie wykorzystuje do tego zmienną ASPNETCORE_ENVIRONMENT.
W Properties/launchSettings.json
mam okreslone profile

"profiles": {
		"IIS Express DEV": {
			"commandName": "IISExpress",
			"launchBrowser": true,
			"environmentVariables": {
				"ASPNETCORE_ENVIRONMENT": "Development",
				"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
			}
		},
		"IIS Express PROD": {
			"commandName": "IISExpress",
			"launchBrowser": true,
			"environmentVariables": {
				"ASPNETCORE_ENVIRONMENT": "Production",
				"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
			}
		},
		"IIS Express STAGING": {
			"commandName": "IISExpress",
			"launchBrowser": true,
			"environmentVariables": {
				"ASPNETCORE_ENVIRONMENT": "Staging",
				"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
			}
		}
  }

Na tej podstawie mogę sprawdzić z użyciem jakiego profilu uruchomiony jest program i wybrać odpowiedni plik.

Jednak przy uruchamianiu testów nie udaje mi się odczytać tej właściwości.
Zgodnie z tym co znalazłem w sieci do projektu z testami dodałem klasę Startup

public class Startup
{
    public void ConfigureHost(IHostBuilder hostBuilder)
    {
        var config = new ConfigurationBuilder()
    				.AddEnvironmentVariables()
    				.Build();
    
        hostBuilder.ConfigureHostConfiguration(builder => builder.AddConfiguration(config));
    }
}

I wstrzyknąłem IConfiguration do klasy z testami

public class Tests
{
   public Tests(IConfiguration config)
   {
     string enviroment = config.GetValue<string>("ASPNETCORE_ENVIRONMENT");
   }
}

Dodałem też plik z konfiguracją profili do projektu.

Niestety zmienna enviroment zawsze jest null.

W jaki sposób to ogarnąć?

Z góry dziękuję.
Pozdrawiam

1

Te zmienne środowiskowe zdefiniowane w profilach są ustawiane tylko, gdy uruchomiamy aplikacje (główny projekt, nie testy) z danym profilem.

Moze napisz, co konkretnie chcesz przetestować. Co to za plik, który chcesz pobrać na podstawie environmentu? appsettings.json?

0

Tak właśnie podejrzewałem.

Chcę wczytać plik .json z danymi testowymi (które powinny być różne dla kazdego profilu).

0

Chcesz przetestować wszystkie pliki?

Jesli environment pobierasz z IHostEnvironment, to wystarczy napisać swoją implementację i zarejestrować ja, nadpisując istniejącą.

Jesli environment pobierasz z IConfiguration, to wystarczy np. załadować konfigurację z kolekcji in memory i tam ustawić odpowiednią zmienna.

0

Chcę puścić testy z danymi z pliku odpowiedniego dla danej konfiguracji.

Właśnie sęk w tym, że nie udaje mi się w żaden sposób pobrać informacji jaka konfiguracja jest wybrana.

0

Wrzuć może kod, który chcesz przetestować.

0

Kod który chce przetestować nie jest w tym momencie istotny.
Potrzebuję danych z różnych plików - w zależności o wybranej konfiguracji - to jest problem (nie testy).

W aplikacji głównej mam coś takiego na przykład:

string environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
if (environmentName != Environments.Production)
{
    // jakieś dodatkowe operacje
}

Podobnie chciałbym zrobić w testach.

3

Właśnie kod jest istotny :) Wygląda na to, że pobierasz environment ze statycznej klasy, a powinieneś wstrzyknąć sobie IHostEnvironment, który możesz potem dowolnie mockować w testach, albo nawet dostarczyć własną implementację. Problem XY.

0

No właśnie nie wiem jak pobrać environment - o to od początku pytam :).

0

Chodziło mi o coś takiego:

// Method that needs to know environment
public string GetFilePath(IHostEnvironment environment)
{
  // return file path based on environment
}

// FakeEnvironmentHost.cs

class FakeHostEnvironment : IHostEnvironment
{
    private readonly string _environment;

    public FakeHostEnvironment(string environment) => _environment = environment;

    public string EnvironmentName => _environment;
}

// Test.cs

var filePath = GetFilePath(new FakeHostEnvironment("Development"));

1 użytkowników online, w tym zalogowanych: 0, gości: 1