Eenheid testen met Jasmine en TypeScript

Ik probeer een eenheidstest te schrijven in Typescript met Jasmine om te compileren. Met het volgende in mijn unit-test-bestand, vraagt ​​Resharper me een link om typen uit jasmine.d.ts te importeren.

/// <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");
    });
});

Dus ik klik op de link en krijg het volgende (eigenlijk heeft de resharper alleen de functie beschrijven voorafgegaan door “Jasmine.”, dus ik heb handmatig de andere Jasmine-aanroepen voorafgegaan):

/// <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");
    });
});

De importinstructie heeft echter een rode kronkelende regel met de foutmelding “Kan externe module ../../../scripts/typings/jasmine/jasmine niet oplossen. Module kan niet worden gealiasd naar een niet-moduletype”

Enig idee wat deze fout veroorzaakt? Ik heb gecontroleerd of de optie “Modulesysteem” is ingesteld op AMD in de instellingen voor het bouwen van mijn project. Ik heb ook gecontroleerd of de jasmijnmodule is gedefinieerd in jasmine.d.ts. Ik heb dit bestand gedownload van de CertainTyped-site.

declare module jasmine {
    ...
}

Antwoord 1, autoriteit 100%

Dit is (naar mijn mening) de beste manier om een ​​ts-nodeapp vanaf 2018 te testen:

npm install --save-dev typescript jasmine @types/jasmine ts-node

In package.json:

{
  "scripts": {
    "test": "ts-node node_modules/jasmine/bin/jasmine"
  }
}

In jasmine.jsonverander het bestandspatroon in *.ts

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

In uw specificatiebestanden:

import "jasmine";
import something from "../src/something";
describe("something", () => {
    it("should work", () => {
        expect(something.works()).toBe(true);
    });
});

Om de tests uit te voeren:

npm test

Hiermee worden de lokaal geïnstalleerde versies van ts-nodeen jasminegebruikt. Dit is beter dan het gebruik van wereldwijd geïnstalleerde versies, want met lokale versies weet je zeker dat iedereen dezelfde versie gebruikt.

Opmerking: als je een web-app hebt in plaats van een node-app, moet je waarschijnlijk je tests uitvoeren met Karma in plaats van de Jasmine CLI.


Antwoord 2, autoriteit 12%

Zet dit bovenaan uw typescript-specificatiebestand:

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

Je moet de volgende Jasmine-modules installeren om dat te laten werken:

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

Zodra je dat doet, zal de IDE (zoals WebStorm) Jasmine en zijn functies, zoals description(), it() en expect() herkennen. Je hoeft ze dus niet vooraf te laten gaan met “Jasmine. ” U kunt ook uw spec-bestanden uitvoeren vanaf de opdrachtregel met behulp van de jasmine-t-module. Installeer deze opdrachtregelprogramma’s wereldwijd:

$ npm install -g jasmine @ert78gb/jasmine-ts

Configureer vervolgens de opdrachtregelmodule “jasmine” zodat Jasmine het configuratiebestand kan vinden. Dan zou je jasmine-ts moeten kunnen uitvoeren en je spec-bestand zou goed moeten werken vanaf de opdrachtregel:

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

.. en je kunt je IDE zo configureren dat het ook zo wordt uitgevoerd, en debug-runs op die manier zouden ook moeten werken (werkt voor mij).

Als je je tests op deze manier schrijft, kun je een Jasmine-testspecificatie op de server uitvoeren zonder Karma, of in een webbrowser met Karma. Zelfde typoscript-code.


Antwoord 3, autoriteit 7%

Als je problemen hebt met importeren, gebruik dan tsconfig-paths

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

Voer jasmijn met typescript uit:

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

Zorg ervoor dat je jasmijn .ts-bestanden zoekt:

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

Om je scripts te testen, heb je mogelijk ook polyfills nodig als je ze in je project gebruikt. Maak een helperbestand met vereiste imports, zoals helpers/global/polifill.ts

import 'core-js';

Antwoord 4, autoriteit 6%

Voor mij deed ik het volgende:

Typen installeren

npm install typings --global

Voeg vervolgens de typen toe voor jasmijn

typings install dt~jasmine --save --global

Antwoord 5, autoriteit 6%

Je zou een import van alleen neveneffectenkunnen proberen die de @types/jasminedeclaratie binnenbrengt en de jasmijnfuncties in het globale bereik plaatst, zodat je ze niet nodig hebt om elke oproep vooraf te laten gaan met jasmine.waardoor een snelle overdracht van bestaande unit-tests mogelijk is en nog steeds goed werkt met webpack.

// tslint:disable-next-line:no-import-side-effect
import "jasmine";
describe("My Unit Test", () => { /* ... */ } );

Natuurlijk moet je nog steeds jasmijn en de typeringen installeren:

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

Maar geen gespecialiseerde jasmijnladers nodig voor ts of node. Voer jasmine gewoon uit tegen de gecompileerde js-bestanden:

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

Ervan uitgaande dat uw typescript-bestanden zich in een “test”-submap bevinden die wordt gecompileerd naar bin/testen u een test/support/jasmine.jsonhebt met zoiets als dit:

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

P.S. al het bovenstaande werkt ook op Windows

Other episodes