Единичное тестирование с использованием Jasmine и TypeScript

Я пытаюсь получить unit test, написанный в Typescript, используя Jasmine для компиляции. В моем модульном тестовом файле Resharper предлагает мне ссылку для импорта типов из 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");
    });
});

Итак, я нажимаю на ссылку и заканчиваю следующим (на самом деле resharper только префикс функции описания с помощью "Жасмин", поэтому я вручную префикс других вызовов Жасмин):

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

Однако оператор import имеет красную строку с ошибкой с сообщением об ошибке "Невозможно разрешить внешний модуль.. /../../scripts/typings/jasmine/jasmine. Модуль не может быть псевдонимом для немодульного типа"

Любая идея, что вызывает эту ошибку? Я проверил, что опция "Модульная система" установлена ​​в AMD в моих настройках сборки проекта. Я также проверил, что модуль жасмина определен в jasmine.d.ts. Я загрузил этот файл с сайта DefinitelyTyped.

declare module jasmine {
    ...
}

Ответы

Ответ 1

Для меня я сделал следующее:

Установить типы

npm install typings --global

Затем добавьте типизацию для жасмина

typings install dt~jasmine --save --global

Ответ 2

Поместите это вверху вашего спецификационного файла typescript:

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

Для этого необходимо установить следующие модули Jasmine:

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

Как только вы это сделаете, IDE (например, WebStorm) распознает Jasmine и его функции, такие как describe(), it() и expect(). Поэтому вам не нужно префикс их "Жасмин". " Кроме того, вы можете запускать ваши файлы spec из командной строки с помощью модуля jasmine-ts. Установите эти инструменты командной строки глобально:

$ npm install -g jasmine jasmine-ts

Затем настройте модуль командной строки "жасмин", чтобы Jasmine мог найти свой файл конфигурации. Затем вы можете запустить jasmine-ts, и ваш файл спецификации должен отлично работать из командной строки:

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

.. и вы можете настроить свою среду IDE для ее запуска так же, как и для отладки, этот путь также должен работать (работает для меня).

Написав ваши тесты таким образом, вы можете запустить спецификацию теста Jasmine на стороне сервера без кармы или запустить ее в веб-браузере с использованием Karma. Тот же typescript код.

Ответ 3

Включите это в свой hasm файл jasmine,...

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

... или установите пакет жасмина npm:

npm install --save-dev jasmine

когда вы используете второй способ (жасмин как модуль), вы должны его импортировать:

var jasmine = require('jasmine');

или

import jasmine from '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");
    });
});

Лично я предпочел бы первый способ, не используя модуль жасмина npm. (Я еще не тестировал модуль)

Ответ 4

По какой-то причине это никогда не отвечали должным образом, но, конечно, все изменилось, но здесь не существует современного ответа, я пришел сюда через Google, потому что я ленив и иногда отрывки Google.

В случае, если вы столкнулись с этой проблемой, убедитесь, что у вас есть @typings/jasmine, установленный как devDependency, и ваш tsConfig содержит типизации в include, например.

  "include": ["typings/**/*.d.ts"]