J'ai une fonction qui crée un élément de script et l'ajoute au corps. Cela ressemble un peu à ceci:
typeof document.body.appendChild.mock.child[0][0] // object
J'utilise des tests en utilisant jest et j'espionne la fonction appendChild
pour affirmer que les paramètres transmis sont ce que j'attends . Ce que j'ai ressemble à ceci:
jest.spyOn(document.body, 'appendChild'); doFunction(); expect(document.body.appendChild).toBeCalledWith( '<script id="abc" src="https://myscript" type="text/javascript" />', );
Malgré la correspondance des chaînes, l'argument qui est passé dans appendChild
n'est pas une chaîne, mais un objet .
const s = document.createElement('script'); s.type = 'text/javascript'; s.src = 'https://myscript'; s.id = 'abc'; document.body.appendChild(s);
J'ai aussi essayé de m'affirmer contre un objet ( {type: '...'}
sans chance. Quelles sont les autres options disponibles avec blague pour tester ce bout de code?
3 Réponses :
Vous pouvez affirmer que appendChild
est appelé avec un élément HTML, ce que renvoie document.createElement
.
expect(document.body.appendChild).toBeCalledWith(expect.any(HTMLScriptElement));
Vous pouvez clarifiez davantage votre test en vérifiant qu'il a été appelé avec un élément de script.
expect(document.body.appendChild).toBeCalledWith(expect.any(HTMLElement));
Merci! Savez-vous s'il existe un moyen d'inspecter le HTMLScriptElement appelé avec? par exemple. pour vérifier que le champ src
est ce que j'attends
Comme le souligne @Alex, document.createElement
crée un objet HTMLScriptElement
.
Vous pouvez vérifier que le HTMLScriptElement
a été créé correctement en vérifiant ses propriétés avec expect.objectContaining
:
const doFunction = () => { const s = document.createElement('script'); s.type = 'text/javascript'; s.src = 'https://myscript'; s.id = 'abc'; document.body.appendChild(s); } test('doFunction', () => { jest.spyOn(document.body, 'appendChild'); doFunction(); expect(document.body.appendChild).toBeCalledWith( expect.objectContaining({ type: 'text/javascript', src: 'https://myscript/', id: 'abc' }) ); // Success! });
Bien - j'aime cette approche car elle teste plus de code, et en conjonction avec expect.any (HTMLScriptElement)
, elle teste tout ce dont j'ai besoin
Bonjour @ChristopherMoore J'obtiens cette ERREUR ==> Attendu: ObjectContaining {"id": "script1", "src": "app / components / myse / quoteandorderconfirmation / script / script 1.js", "type": " text / javascript "} Reçu: .. Pouvez-vous nous aider?
Une autre option consiste à utiliser des plaisanteries (éventuellement inline
)snapshots
:
it('...', () => { doFunction() expect(document.documentElement).toMatchInlineSnapshot(` <html> <head> <!-- ...your appended nodes... --> </head> <body> <!-- ...your appended nodes... --> </body> </html> `) })