Javascript 使用Jasmine和TypeScript进行单元测试
我正在尝试使用Jasmine来编译用Typescript编写的单元测试。在我的单元测试文件中,Resharper会提示我从jasmine.d.ts导入类型的链接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
/// <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
}