从命令行使用Chai和TypeScript运行mocha测试

Dav*_*man 6 mocha.js chai typescript

我想在命令行上运行时让TypeScript,mocha和chai一起工作.我正在使用TypeScript版本0.9.1.1.

我有CalculatorTest.ts:

/// <reference path="../definitions/mocha.d.ts" />
/// <reference path="../definitions/chai.d.ts" />

// import chai = require('node_modules/chai/chai');

var expect = chai.expect;

describe("Calculator", () => {
    var calc: Calculator;

    beforeEach(() => {
        calc = new Calculator();
    });   

    describe("Add", () => {
        it("should have correct results", () => {

            calc.add(1);
            calc.add(2);

            expect(calc.current()).to.equal(3);
        });

        it("this test should fail", () => {
            expect(calc.current()).to.equal(10000);
        });
    })
});
Run Code Online (Sandbox Code Playgroud)

我还有一个单独的Calculator.js文件.

我可以在浏览器中使用页面运行这个:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Mocha Calculator Tests</title>
    <link rel="stylesheet" href="scripts/node_modules/mocha/mocha.css" />
</head>
<body>
    <div id="mocha"></div>
    <script src="scripts/node_modules/mocha/mocha.js"></script>
    <script src="scripts/node_modules/chai/chai.js"></script>
    <script>mocha.setup('bdd')</script>
    <script src="scripts/Calculator.js"></script>
    <script src="scripts/test/CalculatorTest.js"></script>
    <script>
        mocha.checkLeaks();
        mocha.globals(['jQuery']);
        mocha.run();
    </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试在命令行上运行

./node_modules/mocha/bin/mocha
Run Code Online (Sandbox Code Playgroud)

要么

./node_modules/mocha/bin/mocha -r chai
Run Code Online (Sandbox Code Playgroud)

我收到错误:

C:\javascript\Test\Test\scripts\test\CalculatorTest.
js:4
var expect = chai.expect;
             ^
ReferenceError: chai is not defined
    at Object.<anonymous> (C:\javascript\Test\Test\scripts\test\CalculatorTest.js:4:14)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
Run Code Online (Sandbox Code Playgroud)

有什么办法我应该查看chai对象吗?

更新:以下是有关取消注释导入时会发生什么的更多信息:

如果我从DefinitelyTyped更改chai.d.ts以便它启动

declare module 'chai' {
Run Code Online (Sandbox Code Playgroud)

并将文件中的前几行更改为:

/// <reference path="../definitions/mocha.d.ts" />

import chai = require('../definitions/chai');

var expect = chai.expect;
Run Code Online (Sandbox Code Playgroud)

然后文件编译成功.

但是,当我从命令行运行时,我得到了

% ./node_modules/mocha/bin/mocha

C:\javascript\Test\Test\scripts\test\CalculatorTest.js:2
define(["require", "exports", '../definitions/chai'], function(require, export
^
ReferenceError: define is not defined
    at Object.<anonymous> (C:\javascript\Test\Test\scripts\test\CalculatorTest.js:2:1)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
Run Code Online (Sandbox Code Playgroud)

生成的JavaScript文件以:

/// <reference path="../definitions/mocha.d.ts" />
define(["require", "exports", '../definitions/chai'], function(require, exports, __chai__) {
    var chai = __chai__;
Run Code Online (Sandbox Code Playgroud)

我相信TypeScript在这里生成一个模块,因为我有import语句.

Rya*_*ugh 5

我假设你正在使用来自DefinitelyTyped的chai.d.ts.

由于您使用chai作为外部模块(通过导入),因此您需要修改.d.ts文件.更改

declare module chai {

declare module 'chai' {

然后你可以写这个,一切都应该工作:

import chai = require('chai');
Run Code Online (Sandbox Code Playgroud)

如果要在网页中使用它,则必须使用RequireJS并对node(--module commonjs)进行不同的编译,而不是对web(--module amd)进行编译.