2013-10-02 176 views
5

我試圖讓TypeScript,mocha和chai在命令行上運行時一起工作。我正在使用TypeScript 0.9.1.1版本。使用Chai和TypeScript從命令行運行摩卡測試

我有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); 
     }); 
    }) 
}); 

我也有一個單獨的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> 

但是,如果我嘗試使用

./node_modules/mocha/bin/mocha 

./node_modules/mocha/bin/mocha -r chai 

在命令行中運行我收到錯誤:

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) 

有什麼方法可以查找柴的對象嗎?

更新:這裏有當導入註釋掉會發生什麼的詳細信息:

如果我改變從DefinitelyTyped的chai.d.ts,使其開始

declare module 'chai' { 

和更改頂部文件中幾行內容爲:

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

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

var expect = chai.expect; 

然後文件成功編譯。

然而,當我在命令行中運行,我得到

% ./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) 

生成的JavaScript文件開頭:

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

我相信,打字稿這裏生成模塊,因爲我有進口聲明。

回答

5

我假設你使用了DefinitelyTyped的chai.d.ts。

由於您使用chai作爲外部模塊(通過導入),因此您需要修改.d.ts文件。更改

declare module chai {

declare module 'chai' {

然後,你可以這樣寫,一切都應該只是工作:

import chai = require('chai'); 

如果你想在網頁中使用這個,你」必須使用RequireJS並針對節點(--module commonjs)進行不同編譯,而不是針對網絡(--module amd)。

+0

謝謝,這讓我又進了一步,但看到更新的問題。 –

+0

您需要使用'--module commonjs'編譯,而不是'--module amd' –

+1

我建議不要更新chai.d.ts文件。在大多數項目中,TypeScript定義文件通過類似'tsd''(現在的''typings'')來管理。因此,其他項目成員可能會在每次回購時手動進行更新。相反,我建議你在你的倉庫中保存一個獨立的'.d.ts''並在那裏定義任何附加模塊。這將防止手動管理你對新的回購拉動的依賴。當然,你可以在這裏添加來自這個答案的代碼,這非常好。 – Nicky

0

拿我的例子爲一個完整的安裝程序來運行打字稿測試與摩卡和柴:

test.ts

import { expect } from 'chai'; 
import 'ts-node'; 
import 'mocha'; 

describe('#MyDummyTest',() => { 
    it('sould convert be true!',() => { 
     const result = true; 
     expect(result).to.equal(true); 
    }); 
}); 

packaje.json

"devDependencies": { 
    "@angular/cli": "^1.4.9", 
    "@types/chai": "^4.0.4", 
    "@types/mocha": "^2.2.44", 
    "chai": "^4.1.2", 
    "mocha": "^3.5.3", 
    "ts-node": "^3.3.0", 
    "typings": "^2.1.1" 
}, 
"scripts": { 
    "test": "mocha --compilers ts:ts-node/register,tsx:ts-node/register --reporter spec test/test.ts" 
    "test-w": "mocha --compilers ts:ts-node/register,tsx:ts-node/register --watch --reporter spec test/test.ts" 
} 

tsconfig.j兒子

"compilerOptions": { 
    "types": [ "mocha", "chai" ], 
    "typeRoots": [ 
     "./node_modules/@types" 
    ] 
} 

這個列表可以幫助你太:

npm install -g ts-node 
    npm install -g typescript 

Install type definitions: 
    npm install typings -g 
    npm install typings --save-dev 

Install type definitions: 
    npm install @types/chai 
    npm install @types/mocha --save-dev 

Install type definitions: 
    typings install dt~mocha --global --save 
    typings install npm~chai --save 

Install reporter: 
    npm install ts-node --save-dev 

Install ts mocha: 
    npm i -g ts-mocha