Javascript 使用Jasmine和TypeScript进行单元测试

Javascript 使用Jasmine和TypeScript进行单元测试,javascript,unit-testing,typescript,jasmine,chutzpah,Javascript,Unit Testing,Typescript,Jasmine,Chutzpah,我正在尝试使用Jasmine来编译用Typescript编写的单元测试。在我的单元测试文件中,Resharper会提示我从jasmine.d.ts导入类型的链接 /// <reference path="sut.ts" /> /// <reference path="../../../scripts/typings/jasmine/jasmine.d.ts" /> describe("Person FullName", function () { var per

我正在尝试使用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");
    });
});

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

<script type="text/javascript" src="jasmine/lib/jasmine-2.0.0/jasmine.js"></script>
当您使用第二种方式(jasmine作为模块)时,您必须导入它:

var jasmine = require('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");
    });
});

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

我做了以下几点:

安装打字机

npm install typings --global
然后加上茉莉花的打字

typings install dt~jasmine --save --global

将其放在typescript规范文件的顶部:

/// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
let Jasmine = require('jasmine');
一旦这样做,IDE(如WebStorm)将识别Jasmine及其函数,如descripe()、it()和expect()。。因此,您不需要在它们前面加上“Jasmine”。此外,您可以使用Jasmine ts模块从命令行运行spec文件。全局安装这些命令行工具:

$ npm install -g jasmine @ert78gb/jasmine-ts
然后配置“jasmine”命令行模块,以便jasmine可以找到其配置文件。然后您应该能够运行jasmine ts,并且您的规范文件应该可以从命令行正常运行:

./node_modules/.bin/jasmine-ts src/something.spec.ts
。。而且,您也可以将IDE配置为这样运行,这样的调试运行也应该可以(对我有效)

通过这种方式编写测试,您可以在服务器端运行Jasmine测试规范,而无需使用Karma,或者使用Karma在web浏览器中运行它。相同类型的脚本代码。

以下是(在我看来)从2018年开始测试
ts节点
应用程序的最佳方法:

npm install --save-dev typescript jasmine @types/jasmine ts-node
package.json
中:

{
  "scripts": {
    "test": "ts-node node_modules/jasmine/bin/jasmine"
  }
}
在等级库文件中:

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

describe("something", () => {
    it("should work", () => {
        expect(something.works()).toBe(true);
    });
});
要运行测试,请执行以下操作:

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


注意:如果您使用的是web应用程序而不是节点应用程序,则可能应该使用Karma而不是Jasmine CLI运行测试。

如果您在导入方面遇到问题,请使用
tsconfig path

npm i ts-node tsconfig-paths types/jasmine jasmine --save-dev
运行启用类型脚本的jasmine:

ts-node -r tsconfig-paths/register node_modules/jasmine/bin/jasmine.js
确保jasmine将搜索.ts文件:

"spec_files": [
    "**/*[sS]pec.ts"
],
"helpers": [
    "helpers/**/*.ts"
],
要测试脚本,如果在项目中使用多填充,可能还需要多填充。创建具有所需导入的帮助文件,如
helpers/global/polifill.ts

import 'core-js';

您可以尝试一个只产生副作用的导入,它引入了
@types/jasmine
声明,并将jasmine函数放在全局范围内,这样您就不需要在每个调用前面加上
jasmine。
允许从现有单元测试中快速移植,并且仍然可以很好地使用webpack

// tslint:disable-next-line:no-import-side-effect
import "jasmine";

describe("My Unit Test", () => { /* ... */ } );
当然,您仍然需要安装jasmine和打字机:

$ npm i jasmine @types/jasmine --save-dev
但不需要为ts或node提供专门的jasmine加载程序。只需对编译的js文件运行jasmine:

$ node ./node_modules/jasmine/bin/jasmine.js --config=test/support/jasmine.json
假设您的typescript文件位于编译到
bin/test
的“test”子目录中,并且您有一个
test/support/jasmine.json
,如下所示:

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

另外,上述所有功能也适用于Windows

您没有要求这样做,但为了获得额外的分数:一旦您得到AJ的答案并开始运行(使用
ts node
调用Jasmine启动脚本),您可以添加一个新任务:

“脚本”:{
“监视”:“ts节点开发——重生——./node_模块/jasmine/bin/jasmine src/**.spec.ts”
}

当然,如果您愿意,您可以使用Jasmine的配置文件来传递您的规范或任何其他参数。现在,Jasmine将一次运行您的所有规范,然后
ts node dev
将坐在后台等待您的测试或他们可能需要更改的任何内容,此时将再次运行
Jasmine
。我还没有找到一种方法来只运行已经更改的测试(或者其导入已经更改的测试)——据我所知,这是

es6:
从“路径/此处”导入茉莉花。es5:
var Jasmine=require('path/here')。使用
beforeach
it
expect
代替
beforeach
it
expect
。感谢您的回复。我认为在Typescript中,以下内容是有效的?导入Jasmine=require(“…”)。虽然可能不是因为它会产生这么多编译错误……但当我尝试这一方法时,我遇到的问题与我遵循任何其他教程时遇到的问题相同:“ReferenceError:define is not defined”。我认为这可能是因为我使用的是webpack,也可能是因为它是vss sdk web扩展。此方法用于普通ts节点测试(没有webpack)。如果您想要webpack,您可能应该使用karma。如果您需要为jasmine提供参数:
“test”:“ts node--project./tsconfig-server.json node_modules/jasmine/bin/jasmine--config=jasmine.json”,
对于像我这样的jasmine新手,您需要更改jasmine.json以获取*.ts文件而不是*.js文件。当您使用此示例并安装eslint时,这些代码都不会编译。Jasmine类型将不可用。你真的不应该再使用
打字了。在NPM中使用
@types/*
repos中的类型定义要好得多。
jasmine ts
的问题是它基于jasmine 2,因此您无法使用最新和最好的jasmine 3功能。我希望他们把它整理好。在GitHub上有一张公开票:@BennyNeugebauer“they”=us,因为它是开源社区。所以任何需要它的人都可以改进它,我鼓励你们,因为是的,这肯定是一个有帮助的改进!最初的jasmine ts()没有得到积极维护,但ert78gb的fork()得到了积极维护。最初的jasmine ts在其依赖项中存在安全漏洞,但ert78gb的fork没有。我建议像这样安装jasmine ts:
npm安装-save dev@ert78gb/jasmine ts
我得到的“属性”descripe“不存在于”typeof j上
import 'core-js';
// tslint:disable-next-line:no-import-side-effect
import "jasmine";

describe("My Unit Test", () => { /* ... */ } );
$ npm i jasmine @types/jasmine --save-dev
$ node ./node_modules/jasmine/bin/jasmine.js --config=test/support/jasmine.json
{
    "spec_dir": "bin/test",
    "spec_files": [
      "**/*[sS]pec.js"
    ],
    "stopSpecOnExpectationFailure": false,
    "random": false
}