web-dev-qa-db-fra.com

Jasmine toBeUndefined

Je suis nouveau dans Jasmine et je suppose que l'utilisation des correspondances .not.toBeDefined() ou .toBeUndefined() vous permet de vérifier si une variable est undefined:

describe('toBeDefined', function() {

    it('should be defined', function() {
        var obj = {};
        expect(obj).toBeDefined(); // Passes
    });

    it('should not be defined using .not.tobeDefined()', function() {
        //var obj = {};
        expect(obj).not.toBeDefined(); // Fails // ReferenceError: obj is not defined
    });

    it('should not be defined using .tobeUnefined()', function() {
        //var obj = {};
        expect(obj).toBeUndefined(); // Fails // ReferenceError: obj is not defined
    });

});

J'ai complètement compris que cela échouerait dans le code, mais j'ai supposé que l'utilisation de ces correspondances ne le ferait pas. Suis-je en train d'utiliser ces erreurs, ou n'est-il pas possible d'écrire une spécification pour vérifier si quelque chose est undefined?

28
Tom Doe

Le problème est que

  expect(obj).toBeUndefined();

échoue avant même que l'appel à Jasmine ne se produise. Il est erroné de se référer à une variable qui n'est pas définie (dans les nouveaux navigateurs ou en mode "strict" au moins).

Essayez plutôt cette configuration:

it('should not be defined using .tobeUnefined()', function() {
    var obj = {};
    expect(obj.not_defined).toBeUndefined(); 
});

Dans ce code, il y a une variable "obj" dont la valeur est un objet vide. Il est OK en JavaScript de se référer à une propriété inexistante d'un objet, et parce qu'une telle référence aboutit à undefined le test passera. Une autre façon de procéder serait:

it('should not be defined using .tobeUnefined()', function() {
  var no_value;

  expect(no_value).toBeUndefined();
});
40
Pointy

Notez que votre erreur indique que obj is not defined.

Il ne dit pas que obj est non défini.

non défini est en fait un type de données en Javascript.

Toute variable déclarée sans affectation reçoit par défaut une valeur de non définie, mais cette variable doit être déclarée.

Ainsi, lorsque Jasmine teste si une valeur est non définie, il détermine si obj === undefined.

Si vous déclarez

var obj;

alors obj sera testé comme non défini.

Si vous ne déclarez pas obj, le comparateur Jasmine n'a rien à comparer avec le type de données non défini.

4
Philip Raath