• 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

VPS Starter Arubacloud
0 głosów
903 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 (604,780 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 (604,780 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 (604,780 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 (604,780 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ź 660 wizyt
pytanie zadane 15 kwietnia 2022 w JavaScript przez Bakkit Dyskutant (7,600 p.)
+1 głos
1 odpowiedź 196 wizyt
0 głosów
2 odpowiedzi 316 wizyt
pytanie zadane 26 kwietnia 2022 w JavaScript przez Bakkit Dyskutant (7,600 p.)

92,973 zapytań

141,937 odpowiedzi

321,173 komentarzy

62,301 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...