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

test ktory sprawdzi czy funkcja się wykonała

Object Storage Arubacloud
0 głosów
601 wizyt
pytanie zadane 14 czerwca 2022 w JavaScript przez Olivier Mazur Użytkownik (680 p.)
edycja 14 czerwca 2022 przez Olivier Mazur

Hej chce napisac test jednostkowy który sprawdza czy funkcja addClass się wykonała jesli są spełnione warunki. Moze mi ktoś pomoc? Bo błąd który otrzymuje to:

  expect(received).toHaveBeenCalled()

    Matcher error: received value must be a mock or spy function

    Received has value: undefined

Test który mi nie działa:

    test("should add class", () => {
        // given
        const hat = new Hat(true),
            hatWrapper = document.createElement("div");
            global.scrollY = 500;
            hat.prevAnimationAPosY = 300;
            hat.prevPosY=200;
            
        // when
        hat.scrollAnimation(hatWrapper,'400','200')

        // then
        expect(hat.addClass(hatWrapper)).toHaveBeenCalled();
    });

Może mi ktoś pomóc dodać szpiega dla hat.addClass(hatWrapper) bo prawdopodbnie w tym jest problem

https://codepen.io/olivier-mazur/pen/jOZdEQp

2 odpowiedzi

+3 głosów
odpowiedź 14 czerwca 2022 przez Comandeer Guru (601,590 p.)
wybrane 15 czerwca 2022 przez Olivier Mazur
 
Najlepsza

Wg mnie tutaj wgl nie powinno być szpiega. Zauważ, że chcemy sprawdzić, czy hat#scrollAnimation() dodaje klasę do hatWrapper. To, że jest to wewnątrz robione przy pomocy hat#addClass(), jest całkowicie nieistotnym szczegółem implementacyjnym. Tutaj po prostu wypadałoby sprawdzić, czy hatWrapper dostał odpowiednią klasę. Czyli coś typu:

test("should add class", () => {
	// given
	const hat = new Hat(true),
	hatWrapper = document.createElement("div");
	global.scrollY = 500;
	hat.prevAnimationAPosY = 300;
	hat.prevPosY=200;

	// when
	hat.scrollAnimation(hatWrapper,'400','200')

	// then
	expect(hatWrapper.classList.contains('nazwa-klasy')).toEqual(true);
});

 

komentarz 14 czerwca 2022 przez Olivier Mazur Użytkownik (680 p.)
dziękuję. Otrzymuje odpowiedz

expect(received).toEqual(expected) // deep equality

    Expected: true
    Received: false

Rozumiem, ze podaje błędne dane wejsciowe czy powinienem na cos innego zwrócic uwagę?
komentarz 14 czerwca 2022 przez Comandeer Guru (601,590 p.)

A jesteś pewien, że scrollAnimation() się poprawnie wykonuje? Bo to może też być problem.

komentarz 14 czerwca 2022 przez Olivier Mazur Użytkownik (680 p.)
scrollAnimation wykonuje się w momencie scrolla i tylko dla mobilek, zadeklarowełem wyzej zmienną global.scrollY = 500; zeby "udawac", ze sie scrollneło, co by moglo byc powodem, ze scrollAnimation nie wykonuje się poprawnie?
komentarz 14 czerwca 2022 przez Comandeer Guru (601,590 p.)

A czy window global to to samo? Bo zauważ, że Hat korzysta z window.scrollY.

No i samo ustawienie scrollY nic nie daje, ponieważ scrollAnimation() nasłuchuje na zdarzeniu scroll. Musiałbyś najpierw wywołać scrollAnimation() a potem – faktycznie przewinąć (np. przy pomocy window.scrollTo()) i wtedy sprawdzić klasę.

komentarz 14 czerwca 2022 przez Olivier Mazur Użytkownik (680 p.)
test("should add class", () => {
    // given
    const hat = new Hat(true),
    hatWrapper = document.createElement("div");
    hat.prevAnimationAPosY = 300;
    hat.prevPosY=500;
 
    // when
    hat.scrollAnimation(hatWrapper,'400','200')
    window.scrollTo(0, 1000);
 
    // then
    expect(hatWrapper.classList.contains('scroll_down')).toEqual(true);
});

Chodzi tylko o to? Bo dalej mam ten sam bład, że nie otrzymuje klasy. Metody init() raczej wywoływać nie muszę?

komentarz 14 czerwca 2022 przez Comandeer Guru (601,590 p.)

Eh, zapomniałem, że Jest nie odpala się w przeglądarce…

Czyli trzeba by inaczej pokombinować:

  1. Ustawiasz wartość window.scrollY na nową wartość (to obecnie robisz, ale ustawiasz na global, a to raczej inny obiekt).
  2. Wywołujesz hat.scrollAnimation().
  3. Odpalasz zdarzenie scroll, np:
    window.dispatchEvent( new Event( 'scroll' ) );
    
  4. Sprawdzasz, czy klasa została dodana.
komentarz 14 czerwca 2022 przez ScriptyChris Mędrzec (190,190 p.)
  1. Ustawiasz wartość window.scrollY na nową wartość (to obecnie robisz, ale ustawiasz na global, a to raczej inny obiekt).

Dla pewności można by użyć globalThis.

komentarz 15 czerwca 2022 przez Olivier Mazur Użytkownik (680 p.)
edycja 15 czerwca 2022 przez Olivier Mazur

samego window.scrollY nie mogę zmienić bo jest readonly, jak dałem window.scrollTo(0, 1000); to równiez występował ten sam błąd. Działa tylko na global.scrollY, ale srednio wiem czemu :) 

Jeszcze takie pytanie, czy jest różnica jeśli najpierw wywołam hat.scrollAnimation(), a potem ustawie wartość scrollY?

+2 głosów
odpowiedź 14 czerwca 2022 przez ScriptyChris Mędrzec (190,190 p.)
edycja 14 czerwca 2022 przez ScriptyChris

Skorzystaj z jest.spyOn i przekaż do niego obiekt hat. A następnie posługuj się nowo utworzonym spyiem (w przykładzie hatSpy) zamiast obiektem hat:

    test("should add class", () => {
        // given
        const hat = new Hat(true),
            hatWrapper = document.createElement("div");
            global.scrollY = 500;
            hat.prevAnimationAPosY = 300;
            hat.prevPosY=200;

        // utwórz szpiega przekazując obiekt `hat` i nazwę metody do szpiegowania 'addClass'
        const hatSpyAddClass = jest.spyOn(hat, 'addClass');
     
        // when
        hat.scrollAnimation(hatWrapper,'400','200');
 
        // then
        expect(hatSpyAddClass).toHaveBeenCalled(); // czy `addClass` zostało wywołane
        expect(hatSpyAddClass).toHaveBeenCalledWith(hatWrapper) // sprawdź czy był przekazany odpowiedni parametr
    });

Możesz też użyć toHaveBeenCalledWith żeby sprawdzić, czy przy wywołaniu metody addClass przez hat.scrollAnimation był przekazany odpowiedni parametr.

komentarz 14 czerwca 2022 przez Olivier Mazur Użytkownik (680 p.)
dziękuję bardzo!, a przypadek sprawdzenia, czy `hatWrapper` faktycznie ma tę klasę po przewinięciu? czy tez to mogę sprawdzic? czy muszę przebudować funkcje?
komentarz 14 czerwca 2022 przez ScriptyChris Mędrzec (190,190 p.)

Na to pytanie już odpowiedział @Comandeer.

Podobne pytania

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

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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!

...