javascript - Enhetstesting med Jasmine og TypeScript


Jeg prøver å få en enhetstest skrevet i Typescript ved hjelp av Jasmine til å kompilere. Med følgende i enhetstestfilen min, gir Resharper meg en lenke for å importere typer fra 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");
    });
});

Så jeg klikker på lenken og ender opp med følgende (egentlig prefikset ReSharper bare describe-funksjonen med "Jasmine.", så jeg prefikset manuelt de andre Jasmine-kallene):

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

Imidlertid har import-setningen en rød bølget linje med feilmeldingen "Unable to resolve external module ../../../scripts/typings/jasmine/jasmine. Module cannot be aliased to a non-module type"

Noe idé om hva som forårsaker denne feilen? Jeg har sjekket at alternativet "Module System" er satt til AMD i prosjektets byggeinnstillinger. Jeg har også sjekket at jasmine-modulen er definert i jasmine.d.ts. Jeg lastet ned denne filen fra DefinitelyTyped-nettstedet.

declare module jasmine {
    ...
}

Svar #1

Her er (etter min mening) den beste måten å teste en ts-node-app på per 2018:

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

I package.json:

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

I jasmine.json endre filmønster til *.ts

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

I dine spesifikasjonsfiler:

import "jasmine";
import something from "../src/something";

describe("something", () => {
    it("should work", () => {
        expect(something.works()).toBe(true);
    });
});

For å kjøre testene:

npm test

Dette vil bruke de lokalt installerte versjonene av ts-node og jasmine. Dette er bedre enn å bruke globalt installerte versjoner, fordi med lokale versjoner kan du være sikker på at alle bruker samme versjon.

Merk: hvis du har en nettapp i stedet for en node-app, bør du sannsynligvis kjøre testene dine med Karma i stedet for Jasmine CLI.

Svar #2

Sett dette øverst i typescript-spesifikasjonsfilen din:

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

Du må installere følgende Jasmine-moduler for at det skal fungere:

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

Når du gjør det, vil IDE-en (som WebStorm) gjenkjenne Jasmine og funksjonene dens som describe(), it() og expect(). Så du trenger ikke å prefikse dem med "Jasmine." Du kan også kjøre spesifikasjonsfilene dine fra kommandolinjen ved å bruke jasmine-ts-modulen. Installer disse kommandolinjeverktøyene globalt:

npm install -g jasmine @ert78gb/jasmine-ts

Konfigurer deretter kommandolinjemodulen «jasmine» slik at Jasmine kan finne konfigurasjonsfilen sin. Da bør du kunne kjøre jasmine-ts, og spesifikasjonsfilen din bør kjøre fint fra kommandolinjen:

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

.. og du kan konfigurere IDE-en din til å kjøre det på den måten også, og feilsøkingskjøringer på den måten bør også fungere (funker for meg).

Ved å skrive testene dine på denne måten, kan du kjøre en Jasmine-testspesifikasjon på serversiden uten Karma, eller kjøre den i en nettleser ved bruk av Karma. Samme TypeScript-kode.

Relaterte artikler