web-dev-qa-db-fra.com

Tests unitaires avec Jasmine et TypeScript

J'essaie d'obtenir un test unitaire écrit en TypeScript en utilisant Jasmine pour la compilation. Avec le texte suivant dans mon fichier de test unitaire, Resharper me demande un lien pour importer les types à partir de jasmine.d.ts. 

/// <reference path="sut.ts" />
/// <reference path="../../../scripts/typings/jasmine/jasmine.d.ts" />

describe("Person FullName", function () {
    var person;

    BeforeEach(function () {
        person = new Person();
        person.setFirstName("Joe");
        person.setLastName("Smith");
    });

    It("should concatenate first and last names", function () {
        Expect(person.getFullName()).toBe("Joe, Smith");
    });
});

Alors je clique sur le lien et je me retrouve avec ce qui suit (en fait, resharper préfixe la fonction describe avec "Jasmine". J'ai donc préfixé manuellement les autres appels Jasmine):

/// <reference path="sut.ts" />
/// <reference path="../../../scripts/typings/jasmine/jasmine.d.ts" />
import Jasmine = require("../../../Scripts/typings/jasmine/jasmine");

Jasmine.describe("Person FullName", function () {
    var person;

    Jasmine.BeforeEach(function () {
        person = new Person();
        person.setFirstName("Joe");
        person.setLastName("Smith");
    });

    Jasmine.It("should concatenate first and last names", function () {
        Jasmine.Expect(person.getFullName()).toBe("Joe, Smith");
    });
});

Toutefois, l'instruction d'importation comporte une ligne ondulée rouge avec le message d'erreur "Impossible de résoudre le module externe ../../../scripts/typings/jasmine/jasmine. Le module ne peut pas être aliasé pour un type de non-module"

Une idée de ce qui cause cette erreur? J'ai vérifié que l'option "Système de modules" est définie sur AMD dans les paramètres de construction de mon projet. J'ai également vérifié que le module jasmine est défini dans jasmine.d.ts. J'ai téléchargé ce fichier à partir du site DefinitelyTyped.

declare module jasmine {
    ...
}
31
aw1975

Placez ceci en haut de votre fichier de spécifications TypeScript:

/// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
let Jasmine = require('jasmine');

Vous devez installer les modules Jasmine suivants pour que cela fonctionne:

$ npm install jasmine-core jasmine @types/jasmine jasmine-ts --save-dev

Une fois que vous avez fait cela, le IDE (comme WebStorm) reconnaîtra Jasmine et ses fonctions telles que describe (), it () et expect () .. Il n'est donc pas nécessaire de les préfixer avec "Jasmine . " En outre, vous pouvez exécuter vos fichiers de spécifications à partir de la ligne de commande à l'aide du module jasmine-ts. Installez ces outils de ligne de commande globalement:

$ npm install -g jasmine jasmine-ts

Configurez ensuite le module de ligne de commande "jasmine" afin que Jasmine puisse trouver son fichier de configuration. Ensuite, vous devriez être capable d’exécuter jasmine-ts et votre fichier de spécification devrait fonctionner correctement à partir de la ligne de commande:

./node_modules/.bin/jasmine-ts src/something.spec.ts

.. et, vous pouvez configurer votre IDE pour l'exécuter également, et le débogage exécuté de cette manière devrait également fonctionner (fonctionne pour moi).

En écrivant vos tests de cette manière, vous pouvez exécuter une spécification de test Jasmine côté serveur sans Karma ou dans un navigateur Web à l'aide de Karma. Même code TypeScript.

7
Yavin5

Pour moi j'ai fait ce qui suit:

Installer des dactylographies

npm install typings --global

Ensuite, ajoutez les dactylographies pour Jasmin

typings install dt~jasmine --save --global
5
Andrew Newland

Incluez ceci dans votre fichier HTML jasmine, ...

<script type="text/javascript" src="jasmine/lib/jasmine-2.0.0/jasmine.js"></script>

... ou installez le paquet npm jasmine:

npm install --save-dev jasmine

lorsque vous utilisez le second moyen (jasmine en tant que module), vous devez l'importer:

var jasmine = require('jasmine');

ou

import jasmine from 'jasmine';

puis changez l'autre code:

jasmine.describe("Person FullName", function () {
    var person;

    jasmine.beforeEach(function () {
        person = new Person();
        person.setFirstName("Joe");
        person.setLastName("Smith");
    });

    jasmine.it("should concatenate first and last names", function () {
        jasmine.expect(person.getFullName()).toBe("Joe, Smith");
    });
});

Personnellement, je préférerais le premier moyen sans utiliser le module jasmine npm. (Je n'ai pas encore testé le module)

3
marcel

Vous pouvez essayer une importation side-effect uniquement qui introduit la déclaration @types/jasmine et place les fonctions jasmine dans la portée globale. Il n'est donc pas nécessaire de préfixer chaque appel avec jasmine., ce qui permet un port rapide à partir de tests unitaires existants joue à Nice avec webpack.

// tslint:disable-next-line:no-import-side-effect
import "jasmine";

describe("My Unit Test", () => { /* ... */ } );

Bien sûr, vous devez encore installer Jasmin et les typages:

$ npm i jasmine @types/jasmine --save-dev

Mais pas besoin de chargeurs de jasmin spécialisés pour ts ou noeud. Il suffit d’exécuter jasmine contre les fichiers js compilés:

$ node ./node_modules/jasmine/bin/jasmine.js --config=test/support/jasmine.json

En supposant que vos fichiers TypeScript se trouvent dans un sous-répertoire "test" compilant pour bin/test et que vous avez un test/support/jasmine.json avec quelque chose comme ceci:

{
    "spec_dir": "bin/test",
    "spec_files": [
      "**/*[sS]pec.js"
    ],
    "stopSpecOnExpectationFailure": false,
    "random": false
}

P.S. tout ce qui précède fonctionne aussi sous Windows

1
Graeme Wicksted

Si vous avez des problèmes avec les importations, utilisez tsconfig-paths

npm i ts-node tsconfig-paths types/jasmine jasmine --save-dev

Exécutez le jasmin activé pour TypeScript:

ts-node -r tsconfig-paths/register node_modules/jasmine/bin/jasmine.js

Assurez-vous que votre jasmin recherchera les fichiers .ts:

"spec_files": [
    "**/*[sS]pec.ts"
],
"helpers": [
    "helpers/**/*.ts"
],

Pour tester vos scripts, vous aurez peut-être également besoin de polyfill si vous les utilisez dans votre projet. Créez un fichier d'assistance avec les importations requises, tel que helpers/global/polifill.ts

import 'core-js';
0

Pour une raison quelconque, cela n’a jamais été correctement résolu, bien sûr, les choses ont changé, mais il n’existe pas de réponse moderne ici. Je suis venu ici via Google car je suis paresseux et j’ai parfois des extraits de Google.

Dans le cas où vous rencontrez ce problème, assurez-vous que @typings/jasmine est installé en tant que devDependency et que votre tsConfig contient les typages dans les inclus, par exemple.

  "include": ["typings/**/*.d.ts"]
0
Mathijs Segers