javascript - obiectul de apel jest mock este posibil să fie nedefinit
Acesta este un test simplu folosind o funcție simulată. Dar primesc o eroare ts pentru apelul mock Object is possibly 'undefined'.ts(2532). Nu văd cum să scap de această eroare. Aceasta este structura obiectului de apel, așa că cred că îl gestionez corect... dar evident nu așa cum se așteaptă ts.
import { render, fireEvent } from '@testing-library/react'
const mockSetCheckbox = jest.fn(() => Promise.resolve())
test('should select checkbox', () => {
// ...
userEvent.click(checkbox)
expect(mockSetCheckbox.mock.calls[0][0].variables.input.checkbox).toBe(true)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Object is possibly 'undefined'.ts(2532)
})
Răspuns #1
Aș sugera să îți schimbi testul pentru a folosi .toHaveBeenCalled()
test("should select checkbox", () => {
userEvent.click(checkbox)
expect(mockSetCheckbox).toHaveBeenCalledWith(
expect.objectContaining({
variables: expect.objectContaining({
input: expect.objectContaining({
checkbox: true,
}),
}),
})
);
});
care ar susține același lucru, dar vei obține o eroare mult mai ușor de înțeles dacă implementarea se schimbă într-un mod în care funcția nu este apelată.
Când se folosește .toHaveBeenCalled() va arăta astfel:
expect(jest.fn()).toHaveBeenCalledWith(...expected)
Expected: ObjectContaining {"variables": ObjectContaining {"input": ObjectContaining {"checkbox": true}}}
Number of calls: 0
exemplu funcțional
Răspunsul #2
Se spune că mockSetCheckbox.mock.calls[0][0] este posibil undefined, pentru că faci posibil mockSetCheckbox.mock.undefined.variables și nu poți să faci referire la undefined în acest fel.
Încearcă să te ajute pentru că tipul tău pentru orice calls[0][0] este undefined și/sau altceva.
Cea mai simplă soluție este să asiguri pur și simplu verificatorul că nu va fi undefined verificând mai întâi. Există scurtături pentru a face asta mai concis dacă nu vrei o grămadă de if-uri.
if(mockSetCheckbox.mock.calls[0][0]) {
expect(mockSetCheckbox.mock.calls[0][0].variables.input.checkbox).toBe(true)
}
S-ar putea să doriți, de asemenea, să vă asigurați că testul dvs. eșuează dacă este undefined prin throw. Elementele de mai sus vor eșua în tăcere deoarece lipsa expect înseamnă 'trece'. Prefer să fac ambele lucruri, prin prinderea problemei și presupunerea că totul este în regulă după ce caut problemele.
Ceva de genul:
if(mockSetCheckbox.mock.calls[0][0] === undefined) {
throw "oh no!";
}
expect(mockSetCheckbox.mock.calls[0][0].variables.input.checkbox).toBe(true)
Alte opțiuni includ:
expect(mockSetCheckbox.mock.!calls[0][0].variables.checkbox).toBe(true);
// or
expect((mockSetCheckbox.mock.calls[0][0] as Something).variables.input.checkbox).toBe(true);
// or
let val:Something = mockSetCheckbox.mock.calls[0][0];
expect(val.variables.input.checkbox).toBe(true);
... unde Something este orice tip care conține obiectul variables (sau any).
