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

Jak napisac test jednostkowy dla takiej funkcji?

Object Storage Arubacloud
0 głosów
220 wizyt
pytanie zadane 25 grudnia 2021 w JavaScript przez Olivier Mazur Użytkownik (680 p.)

Witam, mam problem  napisanie unit testu dla funkcji loadTime,. Funkcja ta przerabia mape (timeTable) która: wygląda tak:

na tablice result która składa sie z (0,1) - od indexu 3-5(03:00-05:00) to są jedynki i i od 12-14(12:00-14:00) to tez są jedynki dla reszty to są 0. I wtedy teblica result jest przypisywana do tablicy rowTable. Jak ja mogę napisać do tego unit test?

rowTable wyglada tak:

  rowTable: Row[] = [
    { name: this.allDays.monday, items: new Array(24).fill(1), active: true },
    { name: this.allDays.tuesday, items: new Array(24).fill(1), active: true },
    { name: this.allDays.wednesday, items: new Array(24).fill(1), active: true },
    { name: this.allDays.thursday, items: new Array(24).fill(1), active: true },
    { name: this.allDays.friday, items: new Array(24).fill(1), active: true },
    { name: this.allDays.saturday, items: new Array(24).fill(1), active: true },
    { name: this.allDays.sunday, items: new Array(24).fill(1), active: true }
  ];

a funkcja docelowa: loadTime

 loadingTime(): void {
    if (this.inputObject?.timeTable) {
      let result = [...this.inputObject.timeTable].reduce((r, [key, value], i) => {
        r[i] = Array(24).fill(0);
        value.forEach(o => {
          let start = getHours(o.from);
          const end = getHours(o.to);
          while (start <= end) {
            r[i][start] = 1;
            start++;
          }
        })
        return r;
      }, []);

      this.rowTable.forEach((el, i) => {
        el.items = result[i];
        el.active = false;
      })
    }
  }

Kombinowalem jakos tak:

  it("should loading Time"), () => {

    const timetableMock = new Map<number, Array<HourScheduleDefinitionModel>>()
        timetableMock.set(0, [{ from: '00:00', to: '23:00' }]);

    component.loadingTime = () => {};

    const onSaveSpy = spyOn(component, "loadingTime")

    component.loadingTime();

    expect(onSaveSpy).toEqual([........]);

  }

Ale mam wrażenie, ze robie to bez sensu. Prosze o pomoc

4
komentarz 25 grudnia 2021 przez edutomek Dyskutant (8,380 p.)
Sprawa podstawowa: skoro wiadomo, co ma zostać przetworzone i na co, to dlaczego nie napisać tego jako tzw. pure function? Czyli takiej, która przyjmuje argument wejściowy, zwraca wynik - i tyle? Taką funkcję można spokojnie przetestować bez żadnych mocków/stubów...

1 odpowiedź

+5 głosów
odpowiedź 25 grudnia 2021 przez Comandeer Guru (601,110 p.)
wybrane 26 grudnia 2021 przez Olivier Mazur
 
Najlepsza

Skoro chcesz testować funkcję loadingTime() (swoją drogą, to jest zła nazwa jak na funkcję, bo określa stan, a nie czynność, jaką metoda wykonuje), to nadpisanie jej przy pomocy mocka nie ma najmniejszego sensu.

Jak dla mnie po prostu powinieneś wywołać tę funkcję a następnie sprawdzić, czy component#rowTable ma poprawną zawartość – bo ta powinna być ustawiona przez component#loadingTime().

komentarz 26 grudnia 2021 przez Olivier Mazur Użytkownik (680 p.)
A jak moge sprawdzić czy rowTable ma poprawną zawartośc? jakiej metody muszę uzyc i w jaki sposób? Tu wystarczy toBe?

  it('should loading time ', () => {

    expect(component.loadingHours()).toBe(component.rowTable);

  })
2
komentarz 26 grudnia 2021 przez Comandeer Guru (601,110 p.)

Ale metoda loadingTime() nic nie zwraca, więc ten test nie zadziała. Musisz wywołać tę metodę, a potem sprawdzić stan obiektu component. Coś typu:

it("should loading Time"), () => {
    const expectedRowTable = { … };

    component.loadingTime();

    expect( component.rowTable ).toEqual( expectedRowTable );
}

 

Podobne pytania

0 głosów
2 odpowiedzi 223 wizyt
pytanie zadane 10 lutego 2020 w C# przez xFanti Obywatel (1,350 p.)
0 głosów
3 odpowiedzi 385 wizyt
pytanie zadane 25 października 2018 w Java przez blofeld Użytkownik (700 p.)
0 głosów
3 odpowiedzi 342 wizyt
pytanie zadane 14 stycznia 2018 w JavaScript przez whoami.minka Nowicjusz (120 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...