Wstęp
Uruchamiając testy funkcjonalne w przeglądarce wymagane jest, aby weryfikowany system był uruchomiony i gotowy do działania. Możemy go oczywiście uruchomić ręcznie. Jednak projektując dobrej jakości testy automatyczne dążę do tego, aby były one odpowiedzialne za uruchomienie wszystkich komponentów wymagany do ich poprawnego działania.
Dzięki bibliotece Microsoft.AspNetCore.Mvc.Testing możemy uzyskać taki efekt dla aplikacji na pisanej w Blazor i testowanej przy użyciu narzedzia Playwright. Jednak w porównaniu do przykładu z ostatniego posta należy dokonać pewnych zmian.
Implementacja
Zaczynamy od dodania klasy odpowiedzialnej za uruchomienie aplikacji będzie ona dziedziczyć po klasie WebApplicationFactory. Należy nadpisać metodę CreateHost i logikę uruchomienia Hosta. Zmiana spowoduje uruchomienie WebServera, tj. Kestrel, umożliwiający komunikacje z przeglądarką oraz nadpisze właściwość BaseAddress adresem, który możemy użyć później w procesie.
var testHost = builder.Build();
builder.ConfigureWebHost(webHostBuilder => webHostBuilder.UseKestrel());
_host = builder.Build();
_host.Start();
var server = _host.Services.GetRequiredService<IServer>();
var addresses = server.Features.Get<IServerAddressesFeature>();
ClientOptions.BaseAddress = addresses!.Addresses
.Select(x => new Uri(x))
.Last();
testHost.Start();
return testHost;
Potrzebna jest jedna linii w klasie Program testowanej aplikacji, aby móc dodać referencję z projektu zawierającym testy:
public partial class Program { }
Następnym krokiem jest dodanie testów oraz użycia logiki odpowiedzialnej za uruchomienie aplikacji:
[SetUp]
public void SetUp()
{
var sut = new CustomWebApplicationFactory();
_serverAddress = sut.ServerAddress;
}
W metodzie która uruchamia się przed wykonaniem testu tworzymy obiekt nowo dodanej klasy, następnie pobieramy adres URL serwisu, który uruchomi się podczas wykonywania tych linijek kodu.
W konsekwencji konsumujemy adres URL w testach:
[Test]
public async Task HomePageHasLoadedCorrectly()
{
await Page.GotoAsync(_serverAddress);
// Expect a title "to contain" a substring.
await Expect(Page).ToHaveTitleAsync(new Regex("Index"));
}
[Test]
public async Task FaqHasLoadedCorrectly()
{
await Page.GotoAsync(_serverAddress + "faq-custom");
// Expect a title "to contain" a substring.
await Expect(Page).ToHaveTitleAsync(new Regex("FAQCompaniesChat"));
Zakończenie
Dzięki technologi użytej przy budowaniu tego projektu uzyskałem jednorazowa instancje testowa, która może zostać wykorzystana w testach zbudowanych przy użyciu Playwirght.
PR można znaleźć tutaj.