在没有模块的情况下使用TypeScript,Mocha和Chai

时间:2018-10-16 16:52:38

标签: typescript unit-testing mocha chai

我正在使用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'.

我显然有可能遗漏一些明显的东西。

2 个答案:

答案 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));

    });
});