web-dev-qa-db-fra.com

Echec de la force d'un test au jasmin

Si j'ai du code dans un test qui ne devrait jamais être atteint (par exemple, la clause fail d'une séquence de promesse), comment puis-je forcer l'échec du test?

J'utilise quelque chose comme expect(true).toBe(false); mais ce n'est pas joli.

L’alternative est d’attendre l’expiration du test, ce que je veux éviter (car il est lent).

44
Ben

Jasmine fournit une méthode globale fail(), qui peut être utilisée dans des blocs de spécifications it() et permet également d’utiliser un message d’erreur personnalisé:

it('should finish successfully', function (done) {
  MyService.getNumber()
  .success(function (number) {
    expect(number).toBe(2);
    done();
  })
  .fail(function (err) {
    fail('Unwanted code branch');
  });
});

Cette fonctionnalité est intégrée à Jasmine et fonctionne parfaitement partout, par rapport à la méthode "erreur" que j'ai mentionnée ci-dessous.

Avant la mise à jour:

Vous pouvez générer une erreur à partir de cette branche de code, une spécification échouera immédiatement et vous pourrez fournir un message d'erreur personnalisé:

it('should finish successfully', function (done) {
  MyService.getNumber()
  .success(function (number) {
    expect(number).toBe(2);
    done();
  })
  .fail(function (err) {
    throw new Error('Unwanted code branch');
  });
});

Mais vous devez faire attention si vous voulez générer une erreur de Promise success handler then(), car l'erreur sera avalée et ne sera jamais reproduite. Vous devez également être conscient des éventuels gestionnaires d'erreurs dans votre application, qui pourraient intercepter cette erreur dans votre application. Par conséquent, le test ne pourra pas échouer.

59
Michael Radionov

Merci TrueWill d’avoir attiré mon attention sur cette solution. Si vous testez des fonctions qui renvoient des promesses, vous devez utiliser done dans it(). Et au lieu d'appeler fail(), vous devez appeler done.fail(). Voir Documentation Jasmine .

Voici un exemple

describe('initialize', () => {

    // Initialize my component using a MOCK axios
    let axios = jasmine.createSpyObj<any>('axios', ['get', 'post', 'put', 'delete']);
    let mycomponent = new MyComponent(axios);

    it('should load the data', done => {
        axios.get.and.returnValues(Promise.resolve({ data: dummyList }));
        mycomponent.initialize().then(() => {
            expect(mycomponent.dataList.length).toEqual(4);
            done();
        }, done.fail);     // <=== NOTICE
    });
});
0
John Henckel