使用Jasmine和TypeScript进行单元测试

aw1*_*975 42 javascript unit-testing jasmine chutzpah typescript

我正在尝试使用Jasmine编写一个用Typescript编写的单元测试.在我的单元测试文件中有以下内容,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");
    });
});
Run Code Online (Sandbox Code Playgroud)

所以我点击链接并最终得到以下内容(实际上resharper只用"Jasmine."前缀了describe函数,所以我手动为其他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");
    });
});
Run Code Online (Sandbox Code Playgroud)

但是import语句有一条红色波浪线,错误信息"无法解析外部模块../../../scripts/typings/jasmine/jasmine.模块不能别名为非模块类型"

知道是什么导致了这个错误吗?我已经检查过"模块系统"选项在我的项目构建设置中设置为AMD.我还检查过jasmine模块是在jasmine.d.ts中定义的.我从DefinitelyTyped网站下载了这个文件.

declare module jasmine {
    ...
}
Run Code Online (Sandbox Code Playgroud)

AJ *_*son 45

这是(在我看来)ts-node截至2018年测试应用程序的最佳方式:

npm install --save-dev jasmine @types/jasmine ts-node
Run Code Online (Sandbox Code Playgroud)

package.json:

{
  "scripts": {
    "test": "ts-node node_modules/jasmine/bin/jasmine"
  }
}
Run Code Online (Sandbox Code Playgroud)

在您的spec文件中:

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

describe("something", () => {
    it("should work", () => {
        expect(something.works()).toBe(true);
    });
});
Run Code Online (Sandbox Code Playgroud)

要运行测试:

npm test
Run Code Online (Sandbox Code Playgroud)

这将使用本地安装的ts-node和版本jasmine.这比使用全局安装的版本更好,因为对于本地版本,您可以确保每个人都使用相同的版本.

注意:如果您有一个Web应用程序而不是节点应用程序,您应该使用Karma而不是Jasmine CLI运行测试.

  • 对于像我这样的 Jasmine 新手,您需要更改 jasmine.json 以获取 *.ts 文件而不是 *.js 文件。 (5认同)
  • 如果您需要向 jasmine 提供参数: `"test": "ts-node --project ./tsconfig-server.json node_modules/jasmine/bin/jasmine --config=jasmine.json",` (2认同)

Yav*_*in5 7

把它放在打字稿spec文件的顶部:

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

您必须安装以下Jasmine模块才能工作:

$ npm install jasmine-core jasmine @types/jasmine jasmine-ts --save-dev
Run Code Online (Sandbox Code Playgroud)

一旦你这样做,IDE(如WebStorm)将识别Jasmine及其功能,如describe(),it()和expect()..所以你不需要用"Jasmine"作为前缀.此外,您可以使用jasmine-ts模块从命令行运行spec文件.全局安装这些命令行工具:

$ npm install -g jasmine jasmine-ts
Run Code Online (Sandbox Code Playgroud)

然后配置"jasmine"命令行模块,以便Jasmine可以找到其配置文件.然后你应该能够运行jasmine-ts并且你的spec文件应该从命令行运行正常:

./node_modules/.bin/jasmine-ts src/something.spec.ts
Run Code Online (Sandbox Code Playgroud)

..并且,您可以将IDE配置为像这样运行它,并且调试运行方式也适用(适用于我).

以这种方式编写测试,您可以在没有Karma的情况下在服务器端运行Jasmine测试规范,或者使用Karma在Web浏览器中运行它.相同的打字稿代码.

  • @BennyNeugebauer“ they” =我们,因为它是开源社区。因此,任何需要它的人都可以进行改进,我鼓励您,因为是的,那肯定是有益的改进! (2认同)

And*_*and 5

对我来说,我做了以下事情:

安装打字

npm install typings --global
Run Code Online (Sandbox Code Playgroud)

然后添加茉莉花的打字

typings install dt~jasmine --save --global
Run Code Online (Sandbox Code Playgroud)

  • 你真的不应该再使用`typings`了。使用 NPM 中 `@types/*` 存储库中的类型定义要好得多。 (2认同)

Ser*_*ure 5

如果您遇到导入问题,请使用tsconfig-paths

npm i ts-node tsconfig-paths types/jasmine jasmine --save-dev
Run Code Online (Sandbox Code Playgroud)

运行启用打字稿的 jasmine:

ts-node -r tsconfig-paths/register node_modules/jasmine/bin/jasmine.js
Run Code Online (Sandbox Code Playgroud)

确保您的 jasmine 将搜索 .ts 文件:

"spec_files": [
    "**/*[sS]pec.ts"
],
"helpers": [
    "helpers/**/*.ts"
],
Run Code Online (Sandbox Code Playgroud)

为了测试你的脚本,如果你在项目中使用它们,你可能还需要填充。创建一个包含所需导入的帮助文件,例如helpers/global/polifill.ts

import 'core-js';
Run Code Online (Sandbox Code Playgroud)


mar*_*cel 3

将此包含到您的 jasmine html 文件中,...

<script type="text/javascript" src="jasmine/lib/jasmine-2.0.0/jasmine.js"></script>
Run Code Online (Sandbox Code Playgroud)

...或者安装 npm jasmine 包:

npm install --save-dev jasmine
Run Code Online (Sandbox Code Playgroud)

当您使用第二种方式(茉莉花作为模块)时,您必须导入它:

var jasmine = require('jasmine');
Run Code Online (Sandbox Code Playgroud)

或者

import jasmine from 'jasmine';
Run Code Online (Sandbox Code Playgroud)

然后更改其他代码:

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");
    });
});
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我更喜欢第一种方式,而不使用 jasmine npm 模块。(我还没有测试该模块)