javascript - jest: toBeInstanceOf(Object) mislykkes
Bare det å sjekke at vi eksporterer et objekt feiler som følger:
import * as Foo from './foo';
describe('Foo', () => {
test('should export an object', () => {
expect(Foo).toBeInstanceOf(Object);
});
});
får denne feilen:
Selv om jeg kan omgå det ved å bruke typeof:
import * as Foo from './foo';
describe('Foo', () => {
test('should export an object', () => {
- expect(Foo).toBeInstanceOf(Object);
+ expect(typeof LivingAppsCoreReact).toEqual('object');
});
});
Jeg vil gjerne forstå hvorfor Jest definerer at Object-konstruktøren ikke er... Object-konstruktøren.
Sjekket at objektet eksporterer de faktiske nøklene ✅
Miljø :
$» npm ls jest 1 ↵
[email
├── [email
└─┬ [email
└── [email deduped
Svar #1
Dette kan være en feil på Jest/Node-siden, siden globale variabler i Jest-miljøet skiller seg fra Nodes, se:
- https://github.com/facebook/jest/issues/2549
- https://github.com/nodejs/node/issues/31852
- https://github.com/nodejs/node/issues/46558
Når du bruker en standardeksport, er typen på elementet du eksporterer Object, og når du deretter sammenligner det med "Jests Object-type" feiler testen fordi de er i forskjellige kontekster.
Dette er også relatert til atferd som: https://stackoverflow.com/a/75524385/5078746
I ditt tilfelle kan du bruke destrukturering dersom du bruker navngitte eksport (f.eks. export const Foo={...}), noe som vil få Jest til å evaluere objektene dine i samme kontekst.
Jeg mener flytte fra
import * as Foo from './foo';
Til
import { Foo } from './foo';
Eller, du kan sjekke for objektets egenskaper med .toMatchObject(object) i stedet for å sjekke om objektet er et objekt.
Svar #2
Jest-globale skiller seg fra Node-globale
Det er en av de lengste diskusjonene mellom Jest og Node. Det er en forskjell mellom Jest-globale variabler og Node-globale variabler - du kan finne mer informasjon om dette i denne åpne saken på GitHub: Jest globals differ from Node globals.
Med andre ord fungerer funksjonen toBeInstanceOf for objektforekomster av klasser som du oppretter. Den vil imidlertid ikke fungere korrekt for en forekomst av den globale Array-klassen. Jeg vil vurdere å bruke funksjonen toBeInstanceOf for å sjekke mot eksemplet ditt ovenfor. Vennligst ta en titt på dokumentasjonen for toBeInstanceOf og eksempel-koden nedenfor.
Det er fra dokumentene
describe('toMatchObject applied to arrays', () => {
test('the number of elements must match exactly', () => {
expect([{foo: 'bar'}, {baz: 1}]).toMatchObject([{foo: 'bar'}, {baz: 1}]);
});
test('.toMatchObject is called for each elements, so extra object properties are okay', () => {
expect([{foo: 'bar'}, {baz: 1, extra: 'quux'}]).toMatchObject([
{foo: 'bar'},
{baz: 1},
]);
});
});
