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.
