Я подумал, что опубликую это, так как некоторое время спотыкался, прежде чем заметил, что происходит. У меня есть набор тестов, который использует CouchDB в качестве базы данных ведения журнала/записи. Я обнаружил, что вы можете писать собственные отчеты в стажере, поэтому подумал, что могу переместить много моих ручных вызовов 'recordSuccess()'/'recordFailure()' из моего тестового скрипта в собственный отчет, отвечающий на события теста. .
Мой основной тестовый сценарий по-прежнему требует небольшого взаимодействия с Couchdb, поэтому я выделил соединение Couchdb и функции отчетности в модуль, а затем попытался использовать этот модуль как из основного тестового сценария, так и из пользовательского модуля Reporter.
Я обнаружил, что вспомогательный модуль CouchDB создается дважды. Это противоречит ожиданию того, что AMD/RequireJS require() будет выполнять модуль только один раз и кэшировать результат для использования в следующий раз, когда модуль потребуется. Если я помещу оператор «отладчик» в его основной код, он явно будет выполнен дважды. Результат для меня заключается в том, что ссылка Couchdb не определена при вызове из репортера.
Структура каталога:
runTest.js # helper script to run intern test from this dir
src/MainTest.js
src/CouchHelper.js
src/CouchDBReporter.js
src/intern.js # intern config
runTest.js
node node_modules/.bin/intern-client config=src/intern suites=mypackage/WINTest --envConfig=src/test/dev.json
то есть MainTest.js:
define([ 'CouchHelper' ], function (CouchHelper) {
.. test startup ..
CouchHelper.connect(username, password, etc);
CouchDBReporter.js:
define([ 'CouchHelper' ], function (CouchHelper) {
return {
'/test/fail': function (test) {
// Presume the couchdb is connected at this point
CouchHelper.recordFailure(test);
}
}
интерн.js:
... blah blah ..
loader: {
// Packages that should be registered with the loader in each testing environment
packages: [
'node',
'nedb',
'nodemailer',
{ 'mypackage', 'src' }
],
reporters: [ 'console', 'src/CouchDBReporter' ]
CouchHelper.js:
define([
'intern/dojo/node!node-couchdb'
], function (Couchdb) {
debugger; // this is hit twice
var instance = 0;
function CouchHelper() {
this.couchdb = undefined;
this.instance = instance++;
console.log('Created instance ' + this.instance);
}
CouchHelper.prototype = {
connect: function () { this.couchdb = Couchdb.connect(blah); },
recordFailure: function (test) { this.couchdb.insert(blah); }
}
}
При запуске консоль пишет:
Created instance 0
Created instance 0
Когда репортер вызывает recordFailure, он вызывает другой экземпляр CouchHelper, а не файл MainTest.js с именем connect() в .., поэтому this.couchdb не определен, и сценарий аварийно завершает работу. Я могу нормально вызывать recordSuccess/recordFailure из MainTest.js, и this.couchdb допустим в CouchHelper, но экземпляр CouchHelper явно отличается от CouchDBReporter.
Ожидается ли такое поведение, и если да, то каков рекомендуемый способ обмена данными и ресурсами между основным тестовым кодом и кодом в пользовательском генераторе отчетов? Я вижу, что в 3.0 конфигурация репортеров может принимать объект, который может помочь смягчить эту проблему, но кажется, что нужно создавать экземпляр репортера программно, а не определять его в конфигурации.
Ник