Подтвердить что ты не робот

Объединение тестов из нескольких файлов с помощью mocha.js

Я пытаюсь объединить все тесты из нескольких файлов в одном файле, примерно так:

  describe('Controllers', function() {
    describe('messages.js', function() {
      require('./controllertests/messages').test(options);
    })
    describe('users.js', function() {
      require('./controllertests/users').test(options);
    })
  })

Я уверен, что это не лучший способ присоединиться к тестам, у меня есть некоторые примеры, дающие примеры того, как это сделать: s

4b9b3361

Ответ 1

Если вы хотите включить несколько модулей в свою иерархию describe, как вы делаете в своем вопросе, то, что вы делаете, в значительной степени это, если вы не хотите писать пользовательский тестовый загрузчик для Mocha. Написание пользовательского загрузчика не будет проще или сделать код более понятным, чем то, что у вас уже есть.

Вот пример того, как я изменил бы некоторые вещи. Подкаталог test в этом примере организован как:

.
└── test
    ├── a
    │   └── a.js
    ├── b
    │   └── b.js
    ├── common.js
    └── top.js

top.js:

function importTest(name, path) {
    describe(name, function () {
        require(path);
    });
}

var common = require("./common");

describe("top", function () {
    beforeEach(function () {
       console.log("running something before each test");
    });
    importTest("a", './a/a');
    importTest("b", './b/b');
    after(function () {
        console.log("after all tests");
    });
});

Функция importTest предназначена только для того, чтобы показать, как можно было бы обрабатывать повторение импорта нескольких модулей без необходимости повторять всю вещь describe(... require... каждый раз. Модуль common предназначен для хранения того, что вам нужно использовать в нескольких модулях набора тестов. Я не использую его в top, но его можно использовать там, если это необходимо.

Замечу здесь, что beforeEach будет запускать свой код перед каждым тестированием, зарегистрированным в it, будут ли они отображаться внутри describe в top или появляться в любом из импортированных модулей. С помощью --recursive код beforeEach должен быть скопирован в каждый модуль или, возможно, в каждом модуле будет крюк beforeEach, который вызывает функцию, импортированную из общего модуля.

Кроме того, хук after запускается после тестов all в пакете. Это не может быть реплицировано с помощью --recursive. Если вы используете --recursive и добавляете код after к каждому модулю, он будет выполняться один раз для каждого модуля, а не один раз для всего теста.

Наличие всех тестов, отображаемых под одним заголовком top, не может быть реплицировано с помощью --recursive. С --recursive каждый файл может иметь describe("top", но это создаст новый заголовок top для каждого файла.

common.js:

var chai = require("chai");

var options = {
    foo: "foo"
};

exports.options = options;
exports.chai = chai;
exports.assert = chai.assert;

Использование модуля с именем common, как это, я сделал в некоторых своих тестовых наборах, чтобы избежать необходимости require кучу вещей снова и снова и удерживать глобальные только для чтениясильные > переменные или функции, которые не сохраняют состояние. Я предпочитаю не загрязнять объект global, как в ответе thgaskell, потому что этот объект действительно глобальный и доступен даже в сторонних библиотеках, которые может загружать ваш код. Это не то, что я считаю приемлемым в своем коде.

a/a.js:

var common = require("../common");
var options = common.options;
var assert = common.assert;

it("blah a", function () {
    console.log(options.foo);
    assert.isTrue(false);
});

b/b.js:

it("blah b", function () {});

Ответ 2

Ничего не мешает вам запускать несколько тестовых файлов. Как правило, каждый тест не должен зависеть от результатов другого теста, поэтому обмен переменными - это не то, что вы хотели бы сделать.

Вот пример того, как вы могли бы организовать тестовые файлы.

.
├── app.js
└── test
    ├── common.js
    ├── mocha.opts
    │
    ├── controllers
    │   ├── messages-controller.js
    │   └── users-controller.js
    │
    └── modles
        ├── messages-model.js
        └── users-model.js

Затем внутри вашего файла mocha.opts обязательно установите параметр --recursive.

mocha.opts

--ui bdd
--recursive

Если есть общие модули, которые вы хотите включить во все файлы, вы можете добавить это в файл common.js. Файлы в корне каталога test будут запускаться перед файлами во вложенных каталогах.

common.js

global.chai = require('chai');
global.assert = chai.assert;
global.expect = chai.expect;
chai.should();
chai.config.includeStack = true;

process.env.NODE_ENV = 'test';

// Include common modules from your application that will be used among multiple test suites.
global.myModule = require('../app/myModule');

Ответ 3

Хотя это не может быть напрямую связано с вопросом, ответ, который я искал, был:

$ mocha --recursive

Выполняет все тесты в подкаталогах папки "test". Ухоженная. Сохраняет необходимость поддерживать список тестов, которые я хочу загрузить, и на самом деле просто всегда запускать все.

Ответ 4

describe( 'Running automation test, Please wait for all test to complete!'.red, function () {


    var run = require( './Test.js' );

    for ( var i = 0; i < 2; i++ ) {
        run.badLogin();
        run.loginLimited();
        run.acceptJob();
        run.drivingToJob();
        run.arrivedAtJob();
        run.towingJob();
        run.arrivedDestination();
        run.jobComplete();
        run.restrictionLicensePlate();
        run.newNodeMainMenu();
        run.newNodeMainMenuToDrafts();
        run.draftDelete();
        run.resetAllData();
        run.companyVehicle();
        run.actionsScreenClockInOut();
        run.mainMenuLogout();
        run.loginAdmin();
        run.actionsScreenLogout();
    }
} );