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>
`)
})