Я пытаюсь объединить все тесты из нескольких файлов в один файл, примерно так:
describe('Controllers', function() {
describe('messages.js', function() {
require('./controllertests/messages').test(options);
})
describe('users.js', function() {
require('./controllertests/users').test(options);
})
})
Я почти уверен, что это не лучший способ присоединиться к тестам, мне сложно найти примеры того, как это сделать: s
node.js
unit-testing
mocha
Coiso
источник
источник
.only()
было бы полезно иметь возможностьdescribe.only()
запускать целый каталог тестов. Вот что привело меня сюда.Ответы:
Если вы хотите включить несколько модулей в свою
describe
иерархию, как вы это делаете в своем вопросе, то, что вы делаете, в значительной степени это , если вы не хотите написать собственный тестовый загрузчик для Mocha. Написание собственного загрузчика не будет проще и не сделает ваш код более понятным, чем тот, который у вас уже есть.Вот пример того, как я бы изменил несколько вещей.
test
Подкаталог в этом примере организован следующим образом: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
intop
или они появляются в любом из импортированных модулей . При--recursive
этомbeforeEach
код нужно было бы скопировать в каждый модуль или, возможно, у вас был быbeforeEach
крючок в каждом модуле, который вызывает функцию, импортированную из общего модуля.Кроме того,
after
ловушка запускается после всех тестов в наборе. Это не может быть воспроизведено с помощью--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 () {});
источник
global
область видимости, я использую это для библиотек утверждений, чтобы тестовые файлы были более чистыми. Вы же не перезаписываетеglobal.process
. Локальные переменные будут иметь приоритет,global
если другие библиотеки явно не вызывают,global.XYZ
что маловероятно. Он действует только на время проведения тестов. Еще не причинил мне вреда, но я дам вам знать, как только он укусит меня за задницу :)importTest
звонком иrequire('path')()
например?importTest
Функция просто удобная. Важная вещь, которую он делает, - это переносrequire
вызова вdescribe
блок. Важно, чтобыrequire
вызов был заключен в оболочку,describe
иначе модули не будут изолированы в своем собственном блоке, и любой обработчик, установленный импортированным файлом, будет установлен на неправильный блок. Если быimportTest
было заменено прямым вызовомrequire
без упаковкиdescribe
, то модулиa/a
и былиb/b
бы совместно использовать хуки. Например, установленныйbeforeEach
хукb/b
также будет запускаться перед каждым тестом вa/a
.Хотя это может не быть напрямую связано с вопросом, я искал ответ:
Выполнит все тесты в подкаталогах папки "test". Аккуратно. Избавляет от необходимости вести список тестов, которые я хочу загрузить, и на самом деле просто всегда все запускать.
источник
describe
блоков,describe
блоки, охватывающие файлы,--recursive
этого не сделают. Поскольку это не решает проблему OP, я бы не назвал его «лучшим».describe
блокамиdescribe
блоком. Посмотри на вопрос. Блок «Контроллеры»describe
должен включать в себя тесты./controllertests/messages.js
и./controllertests/users.js
. Прикосновение--recursive
к вызову Mocha не создает магическогоdescribe("Controllers"
блока.describe
блоки - чему я научился делать у самого Дамблдора.Нет ничего, что мешало бы вам запустить несколько тестовых файлов. Как правило, каждый тест не должен зависеть от результатов другого теста, поэтому совместное использование переменных - это не то, что вам нужно.
Вот пример того, как вы можете организовать свои тестовые файлы.
Затем внутри вашего
mocha.opts
файла обязательно установите этот--recursive
параметр.mocha.opts
Если есть общие модули , которые вы хотите включить все файлы, вы можете добавить , что в
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');
источник
describe('mytest', function() { /* ..... etc */ });
Я знаю, что это старый пост, но я хотел присоединиться к тому, что было для меня хорошим решением, очень похожим на метод, предложенный OP.
Проект, над которым я работаю, хорошо протестирован, и количество тестов продолжает расти. В итоге я использовал,
require
потому что он синхронный и, следовательно, немного упрощает составление ваших тестов без особых изменений в архитектуре:// inside test/index.js describe('V1 ROUTES', () => { require('./controllers/claims.test'); require('./controllers/claimDocuments.test'); require('./controllers/claimPhotos.test'); require('./controllers/inspections.test'); require('./controllers/inspectionPhotos.test'); require('./controllers/versions.test'); require('./services/login.v1.test'); }); describe('V2 ROUTES', () => { require('./services/login.v2.test'); require('./services/dec-image.v2.test'); }); describe('V3 ROUTES', () => { require('./services/login.v3.test'); require('./services/getInspectionPhotosv3.test'); require('./services/getPolicyInfo.v3.test'); }); describe('ACTIONS', () => { require('./actions/notifications.test'); });
источник
У меня была аналогичная проблема, когда у меня было несколько тестов для классов в одной категории, и я хотел сгруппировать их вместе, чтобы упростить их просмотр в среде IDE. Все мои тесты и код уже использовали модули ES6 - я не хотел их все переписывать, чтобы использовать
require
как я видел в других примерах.Я решил это,
describe
экспортировав мою «группировку» , а затем импортировав ее в мои тестовые файлы и программно добавив их к импортированнымdescribe
. В итоге я создал вспомогательный метод, чтобы абстрагироваться от всей сантехники.В someCategory.spec.js
const someCategory= describe("someCategory", () => {}); // Use this just like a regular `describe` to create a child of this scope in another file export default function describeMember(skillName, testFn) { return describe(skillName, function configureContext() { // Make context a child of `someCategory` context function Context() {} Context.prototype = someCategory.ctx; this.ctx = new Context(); // Re-parent the suite created by `describe` above (defaults to root scope of file it was created in) this.parent.suites.pop(); someCategory.addSuite(this); // Invoke the fn now that we've properly set up the parent/context testFn.call(this); }); }
В индивидуальных тестах:
import { default as describeCategoryMember } from './someCategory.spec'; describeCategoryMember('something', () => { describe('somethingElse', () => { ... }); it('a test', () => { ... }); })
источник
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(); } } );
источник
./Test.js
? Кто знает? Для справки, в настоящее время я лучший ответчик по тегу мокко . Я знаю Мокко от и до, но я не могу понять этот ответ.