Использование TypeScript, Mocha и Chai без модулей - PullRequest
0 голосов
/ 16 октября 2018

Я использую 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 голосов
/ 17 октября 2018

В случае, если это кому-то пригодится, я нашел хакерский обходной путь:

Я установил и изменил 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));

    });
});
0 голосов
/ 16 октября 2018

Переменные ячейки и лабиринта не определены нигде в вашем тестовом файле.Вы не можете создать новый лабиринт и новую ячейку, потому что они не существуют.

Я никогда не слышал о загрузке класса из другого файла без его экспорта, и я не знаю, что делает mocha.addFile, так как я предпочитаю Jasmine, а не Mocha иChai ... особенно для проектов Typescript.

Если, однако, строка mocha.addFile создает выходную переменную с содержимым того, что определено в файле, попробуйте определить их как Maze и Cell.Затем создайте объекты.

Однако лучше всего было бы сделать экспорт для классов Cell и Maze и импортировать их в тестовый файл.

...