Stubbing fenêtre.emplacement.href Sinon avec
Je suis en train de tester certains de code côté client et pour cela j'ai besoin d'écraser la valeur de window.location.href
de la propriété à l'aide de Moka/Sinon.
Ce que j'ai essayé jusqu'à présent (à l'aide de cet exemple):
describe('Logger', () => {
it('should compose a Log', () => {
var stub = sinon.stub(window.location, 'href', 'http://www.foo.com');
});
});
Le coureur affiche l'erreur suivante:
TypeError: Personnalisé tampon doit être une fonction ou un descripteur de propriété
Modifiant le code de test pour:
describe('Logger', () => {
it('should compose a Log', () => {
var stub = sinon.stub(window.location, 'href', {
value: 'foo'
});
});
});
Qui donne cette erreur:
TypeError: Tentative d'enveloppement propriété de chaîne href fonction
Passage d'une fonction en tant que troisième argument de sinon.stub
ne fonctionne pas non plus.
Est-il un moyen de fournir un faux window.location.href
chaîne, mais aussi pour éviter la redirection (depuis que je suis en essais dans le navigateur)?
OriginalL'auteur Francesco Pezzella | 2016-04-17
Vous devez vous connecter pour publier un commentaire.
Talons ne peut pas remplacer les attributs, seules les fonctions.
L'erreur renvoyée renforce cette idée:
À partir de la documentation:
http://sinonjs.org/releases/v2.0.0/stubs/
Solution Possible
Alors que de nombreux builtin les objets peuvent être remplacé (pour les tests), certains ne le peuvent pas. Pour les attributs, vous pouvez créer façade objets que vous avez à utiliser dans votre code et d'être en mesure de les remplacer par des tests.
Par exemple:
Utilisation:
Vous pouvez alors tester l'écriture
Note le enchaînés
returns()
appel. Il y a une autre erreur dans votre code: le troisième argument doit être une fonction non pas de la valeur sur un autre type. C'est un rappel, pas ce que l'attribut doit retourner.Voir le code source de
stub()
window.location.href
valeur. Depuis que je suis en utilisant le Moka html coureur à tester dans le navigateur, est-il possible de concevoir une valeur pourwindow.location.href
en sorte que le code testé pouvez accéder à cette valeur, sans avoir le navigateur de suivre l'URL?Malheureusement pas. Mais d'un autre hack qui viennent à mon esprit: pour configurer la mise en évidence du serveur web de retour de la suite de test runner à tout le chemin et de faire le framework de test pour constandly enregistrer les résultats dans le local de stockage et de le recharger lors du chargement de la page (redirection). Bien sûr, vous devriez alors pas de redirection "foo.com" mais "/foo/dir". S'il vous plaît recherche Stackoverflow pour des questions similaires sur ce sujet et si vous ne pouvez pas trouver des réponses poser une autre question (qui est clairement écrit que celui-ci :).
Une autre alternative, nous donnent souvent des gens sur l'Sinon issue tracker est prêt façade couche pour globals comme
wrapple
dans votre code client, puis écraser ses méthodes. Réalise la même chose.OriginalL'auteur try-catch-finally
Vous devez utiliser
global
de se moquer de l'window
objet pour votre test enbeforeEach
ouit
par exemple
Moi aussi, je suis super content que vous avez trouvé utile
grande solution simple. La seule chose que j'avais à faire était de faire
href
une chaîne de caractères au lieu d'un objet.Corrigez-moi si je me trompe, mais en substituant l'objet global serait de le suivre pour le reste de vos fichiers de test à droite? Sens il serait bien sûr pour tout autre cas de test. Peut-être pas être un problème, mais un FYI.
Pour résoudre ce problème au début de l'essai, j'ai sauvé l'objet global
const originalWindow = global.window
et puis à la fin du test, j'ai restauré ilglobal.window = originalWindow
.OriginalL'auteur KhaledMohamedP
Utilisation
window.location.assign(url)
au lieu de remplacer la valeur dewindow.location
. Ensuite, vous pouvez simplement talon laassign
méthode sur lawindow.location
objet.http://www.w3schools.com/jsref/met_loc_assign.asp
À mon humble avis, cela s'explique parfaitement adéquate wrt de la discussion. Pour élaborer sa réponse, modifier le code du client pour remplacer
window.location = url
avecwindow.location.assign(url)
. Vous pouvez ensuite talon laassign
méthode de lalocation
objet comme ceci:var stub = sinon.stub(window.location, 'assign')
Cette réponse est fausse. Vous ne pouvez pas réaffecter (stub)
location.assign
, au moins dans google Chrome, unwindow.location.assign = function() { console.log("meh"); }
n'a aucun effet. Lors de l'appel delocation.assign()
- je obtenirUncaught TypeError: Failed to execute 'assign' on 'Location': 1 argument required, but only 0 present.
(qui indique la méthode native se plaint du manque d'argument).Merci pour la correction. J'ai seulement essayé ceci dans un navigateur sans et il a travaillé pour moi. Mais, si vous exécutez votre moka tests dans un navigateur tel que Chrome, que cette méthode ne fonctionnerait pas.
OriginalL'auteur Danny Andrews