我正在使用TypeScript并尝试这样做而不创建任何模块(即没有export
语句)。使用模块需要使用SystemJS或AMD,而我正在尝试使项目尽可能简单。
我想创建单元测试,而Mocha / Chai似乎是最流行的方法。
我有3个文件:
// ../src/Cell.ts
class Cell {
public Z: number;
public Y: number;
public X: number;
constructor (z: number, y: number, x: number) {
this.Z = z;
this.Y = y;
this.X = x;
}
}
// ../src/Maze.ts
class Maze {
public myCell: Cell;
private width: number;
constructor (width: number) {
this.myCell = new Cell(-1, -1, -1);
}
protected directionModifier(cell: Cell, direction: string) {
// does something
}
}
// ../test/MazeTests.ts
let chai = require('chai');
import { expect } from 'chai';
var assert = require('assert');
var mocha = new Mocha();
mocha.addFile('../src/Cell.ts');
mocha.addFile('../src/Maze.ts');
describe('Maze Test Suite', function () {
it('should return a cell x-1 of the current location (1 cell to the south)', function () {
let myMaze = new Maze(4);
let myCell = new Cell(0,0,0);
const result = myMaze.directionModifier(myCell,"South");
assert.deepEqual(result, new Cell(0,1,0));
});
});
运行npm test
时出现一些错误:
test/MazeTests.ts(42,20): error TS2304: Cannot find name 'Maze'.
test/MazeTests.ts(43,20): error TS2304: Cannot find name 'Cell'.
test/MazeTests.ts(47,38): error TS2304: Cannot find name 'Cell'.
我显然有可能遗漏一些明显的东西。
答案 0 :(得分:0)
单元格和迷宫变量未在测试文件中的任何位置定义。您不能创建新的迷宫和新单元,因为它们不存在。
我从来没有听说过要从另一个文件中加载一个类而不将其导出,而且我也不知道mocha.addFile是做什么的,因为我更喜欢茉莉花而不是Mocha和Chai ...尤其是对于Typescript项目。
但是,如果行mocha.addFile使用文件中定义的内容创建输出变量,请尝试将其定义为Maze和Cell。然后创建对象。
但是,最好的方法是在Cell和Maze类上进行导出,并将它们导入测试文件中。
答案 1 :(得分:0)
万一这对其他人有用,我想出了一个解决方法:
我安装并修改了concat:
npm install concat
// in concat/index.js
// change lines 25-26 so that the `read` function is:
const read = (fName) => new Promise((res, rej) => {
fs_1.readFile(path_1.resolve(fName), (err, str) => {
if (err)
rej(err);
var newText = str.toString().replace(/^class /g, 'export class ')
res(newText)
});
});
// in the test file:
// first run: comment out the later lines
// next run: use whole document
import { expect } from 'chai';
import 'mocha';
var concat = require('concat')
var assert = require('assert');
concat([
"./src/Cell.ts",
"./src/Character.ts",
"./src/Maze.ts",
"./src/MazeView.ts",
"./src/main.ts"], './test/testable.ts');
import { Cell } from '../test/testable';
import { Maze } from '../test/testable';
describe('Maze Test Suite', function () {
it('should return a cell x-1 of the current location (1 cell to the south)', function () {
let InstanceOfMaze = new Maze(4, 8, 8);
const result = InstanceOfMaze.directionModifier(new Cell(0, 0, 0), "South");
assert.deepEqual(result, new Cell(0, 1, 0));
});
});