• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Node/Jest. Testy wewnątrz funkcji asynchronicznej.

Object Storage Arubacloud
0 głosów
173 wizyt
pytanie zadane 1 kwietnia 2021 w JavaScript przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 1 kwietnia 2021 przez Jakub 0

Witam, przejdę od razu do konkretów. Mam aplikacje w Node/Express i chcę napisać testy automatyczne z użyciem Jest. Mój dylemat jest następujący:

const request = require('supertest');

// konfiguracja aplikacji dla trybu testowego
const dotenv = require('dotenv');
dotenv.config({ path: './config.test.env' });

const createApp = require('../server'); 

(async () => {
    // czekamy aż aplikacja się utworzy
    const app = await createApp();

    // uruchamiamy testy... 

    // przykładowy test, który będzie wymagał obiektu app do działania
    test('some test', () => {
        expect(2+2).toBe(4);
    });

})();

Gdyby wywołanie test() znajdowało się przed await createApp() to wszystko było by w porządku.

Jednak w mojej obecnej konfiguracji, dostaje przewidywalny komunikat:

Your test suite must contain at least one test.

Specjalnie się temu nie dziwie.

Zdałem sobie jednak sprawę, że nie mam pojęcia jak sprawić żeby Jest poczekał na wywołanie testu. Potrzebuje przecież wcześniej załadować aplikację, żeby później ją używać.

Szukałem informacji, ale nic nie udało mi się znaleźć.

Będę wyjątkowo wdzięczny za pomoc w tej sytuacji yes Pozdrawiam serdecznie :)

komentarz zamknięcia: Problem rozwiązany

1 odpowiedź

+1 głos
odpowiedź 1 kwietnia 2021 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 1 kwietnia 2021 przez Jakub 0
 
Najlepsza

Czemu nie załadujesz potrzebnych rzeczy w asynchronicznym handlerze beforeAll?

https://jestjs.io/docs/setup-teardown#one-time-setup

https://jestjs.io/docs/api#beforeallfn-timeout

komentarz 1 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
Dziękuje za szybką pomoc! Z jakiegoś powodu nie pomyślałem o wykorzystaniu funkcji lifecycle w tej sytuacji.
1
komentarz 2 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)

@ScriptyChris,

Korzystając z okazji, pozwalam zadać sobie jeszcze drobne pytane w tym temacie. Mianowicie czy każde wywołanie handlera test powinno być niezależne, czy jednak mogą one być ze sobą powiązane? Np: czy ten kod jest dobrą praktyką:

beforeAll(async () => {
    app = await createApp();
    testSession = session(app);
});

// ----------------------------------------------------------------------------

test('should signin', async () => {
    const response = await testSession.post('/api/v1/auth/signin').send({...}).expect(200);
});

// ----------------------------------------------------------------------------

test('should not signin twice', async () => {
    await testSession.post('/api/v1/auth/signin').send({...}).expect(400);
});

// ----------------------------------------------------------------------------

test('should create new offer for auth user', async () => {
    await testSession.post('/api/v1/offers').send({...}).expect(201);
});

// ----------------------------------------------------------------------------

afterAll(async () => {
    await Offer.deleteMany();
});

 

Każde kolejne wywołanie test() zależy tu od poprzedniego. Oczywiście potem, testy będą bardziej zorganizowane i pogrupowane.

Dziękuje za radę :)

1
komentarz 2 kwietnia 2021 przez ScriptyChris Mędrzec (190,190 p.)

Ogólnie, testy jednostkowe - jak sama nazwa wskazuje - powinny testować jednostkę kodu i być od siebie niezależne. Więc abstrahując od użytego frameworka (chyba, że w docsach jest napisane inaczej), poszczególne testy powinny sprawdzać jeden przypadek. Jeśli chcesz sprawdzić, jak zachowuje się apka przy podwójnym logowaniu (tzn. jedno po drugim), to piszesz test, w którym logujesz się dwa razy.

Jeśli test A będzie zależny od testu B, to zmiana bądź np. wyłączenie testu B wpłynie na wynik testu A. Natomiast ,testy powinny działać przewidywalnie i powtarzalnie.

Przy okazji. powyższe wygląda bardziej na testy integracyjne niż jednostkowe, bo odpytujesz API. No chyba, że użyte metody post to mocki, które pod spodem nie komunikują się z API.

komentarz 2 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
edycja 2 kwietnia 2021 przez Jakub 0

Przy okazji. powyższe wygląda bardziej na testy integracyjne niż jednostkowe, bo odpytujesz API. No chyba, że użyte metody post to mocki, które pod spodem nie komunikują się z API.

Znaczy wydaje mi się, że można to nazwać testami jednostkowymi, bo serwer nie musi być nawet uruchomiony by odpalić testy. Takie funkcjonalności jak korzystanie z ograniczonego 3rd party API uczynię oczywiście jako mocki. Chociaż ciężko mi się jeszcze wypowiedzieć w tej sprawie, bo pierwszy raz piszę testy automatyczne.

A to źle pisać testy integracyjne z Jest?

 

1
komentarz 2 kwietnia 2021 przez ScriptyChris Mędrzec (190,190 p.)

Możesz napisać testy integracyjne w Jest. Tylko myślałem, że to co piszesz uznajesz za testy jednostkowe.

W każdym razie, nie pisałbym testów zależnych od siebie, chyba że wykonujesz w nich kolejne kroki, np. w przypadku testu E2E:

  1. zaloguj się
  2. przejdź do ustawień profilu
  3. zmień adres e-mail

Tutaj każdy kolejny test sprawdza jakiś osobny ficzer (logowanie, nawigacja, edycja danych), więc następny krok zależy od poprzedniego. Jednak, gdy piszesz test dla danego przypadku jednego ficzera, który np. ma sprawdzić, co się stanie gdy user będzie chciał zalogować się 2 razy, to powinieneś w tym jednym teście wywołać sytuację, w której takie logowanie następuje i sprawdzić czy dzieje się to, czego oczekujesz - niezależnie od tego co się dzieje w innych testach.

Co do testów jednostkowych, to polecam ten artykuł:

https://devstyle.pl/2020/06/25/mega-pigula-wiedzy-o-testach-jednostkowych/

Podobne pytania

+1 głos
1 odpowiedź 179 wizyt
+1 głos
1 odpowiedź 172 wizyt
0 głosów
2 odpowiedzi 215 wizyt
pytanie zadane 26 kwietnia 2022 w JavaScript przez Bakkit Dyskutant (7,600 p.)

92,568 zapytań

141,422 odpowiedzi

319,637 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...