Utilisation des instructions conditionnelles dans les tests de Jasmin
J'ai deux fonctions que je veux tester; une qui ne fonctionne que dans "les navigateurs modernes" l'autre qui ne fonctionne que dans les "vieux" navigateurs.
Je suis en utilisant le Jasmin de mon framework de test et de Karma pour exécuter mes tests. Le Karma va lancer de nombreux navigateurs dans lequel tous les tests sont exécutés.
Mon problème est que les tests de TOUS mes fonctions dans TOUS les navigateurs mener quelques tests à l'échec. Par exemple, le test d'une fonction qui doit s'effectuer uniquement dans les navigateurs modernes échoue lorsqu'il est testé avec IE8.
Code de test:
function getStuffFromSmartBrowser() {
return 'foo';
}
function getStuffFromNotSoSmartBrowser() {
return 'bar';
}
if ('intelligence' in browser) {
getStuffFromSmartBrowser();
} else {
getStuffFromNotSoSmartBrowser();
}
D'origine code de test:
describe("A suite", function () {
it("for smart browsers", function () {
expect(getStuffFromSmartBrowser()).toEqual('foo');
});
});
describe("A suite", function () {
it("for not so smart browsers", function () {
expect(getStuffFromNotSoSmartBrowser()).toEqual('bar');
});
});
Dans ces cas de test, un test échouera dans un type de navigateurs alors que les autres test échouera dans l'autre type de navigateurs.
Alternative de code de test:
describe("A suite", function () {
if ('intelligence' in browser) {
it("for smart browsers", function () {
expect(getStuffFromSmartBrowser()).toEqual('foo');
});
} else {
it("for not so smart browsers", function () {
expect(getStuffFromNotSoSmartBrowser()).toEqual('bar');
});
}
});
L'alternative du code de test à exécuter parfaitement bien dans tous les navigateurs testés.
Questions:
Un - il Est de bonne pratique d'utiliser des instructions conditionnelles dans les tests?
B - Si non, quelle serait une meilleure approche?
browser == LegacyBrowser || realTestCondition
. Ce court-circuit si le test ne devrait pas fonctionner sur un navigateur existant.
OriginalL'auteur redrum | 2014-03-21
Vous devez vous connecter pour publier un commentaire.
Il est généralement considéré comme une mauvaise pratique d'avoir des conditions à l'intérieur de le code de test. En dehors du code de test est un peu plus acceptable et, en l'absence d'un mécanisme intégré pour sélectionner des spécifications de test par navigateur, votre solution est probablement le plus simple. Cependant, vous êtes couplage des tests unitaires pour le navigateur implémentations spécifiques.
Une "meilleure" approche serait de masquer votre navigateur de code derrière une seule fonction et l'utilisation fonction de détection de pour effectuer la répartition multiple.
Voici où ça devient malpropre. Vos deux fonctions différentes valeurs de retour. Idéalement, vous aurez envie de la même valeur de retour pour toutes les fonctions, mais ce n'est pas toujours simple. Par exemple, textarea sélection dans IE8 usages complètement différents objets que textarea sélection dans les navigateurs modernes. Parfois, vous pouvez cacher les détails (par exemple, à l'aide de la Modèle De Stratégie), parfois vous ne pouvez pas.
Si vous ne pouvez pas le rendre propre, à l'évidence.
OriginalL'auteur Eric