Использование TypeScript, 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 ответа
На случай, если это пригодится кому-то еще, я нашел хакерский обходной путь:
Я установил и изменил 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));
});
});
Переменные ячейки и лабиринта не определены нигде в вашем тестовом файле. Вы не можете сделать новый лабиринт и новую ячейку, потому что они не существуют.
Я никогда не слышал о загрузке класса из другого файла без его экспорта, и я не знаю, что делает mocha.addFile, так как я предпочитаю Jasmine, а не Mocha и Chai... особенно для проектов Typescript.
Однако, если строка mocha.addFile создает выходную переменную с содержимым того, что определено в файле, попробуйте определить их как Maze и Cell. Затем создайте объекты.
Однако лучшим подходом было бы сделать экспорт для классов Cell и Maze и импортировать их в тестовый файл.