Проблема
Я пытаюсь запустить тест на огурец с помощью тестера Karma в моем проекте Npm с использованием адаптера karma-cucumber- js. Однако при запуске теста в консоли я нахожу следующую ошибку:
START:
PhantomJS 2.1.1 (Mac OS X 0.0.0) ERROR
ReferenceError: Can't find variable: __adapter__
at features/Test.steps.js:80
Для большего контекста я нахожусь в процессе миграции платформы. Ранее у нас была сложная система, которая по существу использовала карму 1.7.x, огурец 1.2.x, карма-огурец- js 0.3.3 и Узел 0.8.x. Я пытаюсь настроить простой проект npm с теми же точными версиями (за исключением того, что сейчас я использую Node 8.x, так как мне не разрешено использовать 0.8.x). У нас есть набор из тысячи старых тестов, для которых мы хотели бы свести к минимуму модификации, и было бы проще всего запустить плагин karma-cucumber- js, поскольку наша система тестирования тесно связана с кармой и огурцом. ,
Вещи, которые я пробовал
Я немного поигрался с зависимым исходным кодом karma-cucumber- js, подправив код в каталоге node_modules моего пакета, чтобы попытаться лучше понять вопрос под рукой. Мне удалось обойти вышеуказанную проблему, изменив эти строки в адаптере. js, чтобы глобализировать переменную адаптера в окне следующим образом:
var __adapter__;
(function (win) {
var adapter = new karma.CucumberAdapter(__karma__);
__adapter__ = adapter;
__karma__.start = adapter.getStart();
win.__adapter__ = __adapter__;
})(window);
, что привело к следующей ошибке :
PhantomJS 2.1.1 (Mac OS X 0.0.0) ERROR
ReferenceError: Can't find variable: Cucumber
at node_modules/karma-cucumber-js/src/adapter.js:242
Который я обошел, добавив следующую строку кода в начало этого самого файла после слова «использовать строгий»:
var Cucumber = require('../../cucumber/release/cucumber.js');
, что привело к этой проблеме:
PhantomJS 2.1.1 (Mac OS X 0.0.0) ERROR
ReferenceError: Can't find variable: CucumberHTML
at node_modules/karma-cucumber-js/src/adapter.js:177
И обходной путь должен был вручную потребовать этот файловый адаптер. js:
var CucumberHTML = require('../../cucumber-html/src/main/resources/cucumber/formatter/formatter.js');
С этим "взломом" тесты на огурец теперь могут запускаться успешно:
START:
PhantomJS 2.1.1 (Mac OS X 0.0.0) LOG: 'Found features: /base/features/Test.feature'
PhantomJS 2.1.1 (Mac OS X 0.0.0) LOG: 'Tags: '
Is it Friday yet?
Friday is Friday
✔ Given today is Friday
✔ When I ask whether it's Friday yet
✔ Then I should be told "TGIF"
Finished in 0.002 secs / 0.002 secs @ 19:36:12 GMT-0700 (PDT)
SUMMARY:
✔ 3 tests completed
Основная проблема заключается в том, что [эти переменные Typescript] [4], объявленные в конце пакетов karma-cucumber- js, по какой-то причине недоступны для использования , Я полагаю, это связано с проблемой проводки в веб-пакете.
Некоторые другие вещи, которые я пробовал:
- Использование других адаптеров карма-огурца (есть еще 2), не повезло.
- Игра с комбинациями версий карма / фантоми / огурец
- Использование Firefox и Chrome вместо Фантома JS
Мои вопросы
- Мне нужна помощь, чтобы понять, почему эта настройка веб-пакета не работает. Как я могу это исправить?
- Есть ли какие-либо шаги, которые я пропускаю, или альтернативные подходы, которые я должен предпринять, чтобы отладить и решить проблему?
Я включил часть кода проекта ниже, Спасибо за ваше время!
Код проекта
пакет. json:
{
"name": "npm-pretty-much-local-example",
"version": "1.0.0",
"scripts": {
"wp": "webpack",
"wpd": "webpack --debug",
"test": "./node_modules/karma/bin/karma start"
},
"devDependencies": {
"@babel/core": "^7.7.2",
"@babel/preset-env": "^7.7.1",
"@babel/preset-react": "^7.7.0",
"babel-loader": "^8.0.0",
"@babel/preset-typescript": "^7.7.x",
"babel-generator": "^6.26.1",
"babel-core": "^6.26.3",
"cucumber": "^1.2.x",
"jquery": "^3.4.1",
"karma": "^1.7.x",
"karma-cucumber-js": "^0.3.3",
"karma-mocha-reporter": "^2.0.5",
"karma-phantomjs-launcher": "^1.0.x",
"karma-webpack": "^1.7.x",
"socket.io": "^1.4.x",
"webpack": "^3.7.1",
"setimmediate": "^1.0.5",
"karma-typescript-preprocessor": "^0.4.0"
},
"dependencies": {}
}
webpack.config. js:
const path = require('path');
module.exports = {
context: path.resolve('.'),
entry: './src/index.js',
output: {
filename: "./dist/output.js"
},
resolve: {
extensions: ['.js'],
modules: [
path.resolve('./src'),
path.resolve('./node_modules')
]
}
};
Test.feature:
@Test
Feature: Is it Friday yet?
Everybody wants to know when it's Friday
Scenario: Friday is Friday
Given today is Friday
When I ask whether it's Friday yet
Then I should be told "TGIF"
Test.steps. js:
function isItFriday(today) {
if (today === "Friday") {
return "TGIF";
} else {
return "Nope";
}
}
// TODO: why is this not defined, and how was __adapter__ defined in the first place?
__adapter__.addStepDefinitions(function (scenario) {
scenario.Given('today is {string}', function (givenDay) {
this.today = givenDay;
});
scenario.When('I ask whether it\'s Friday yet', function () {
this.actualAnswer = isItFriday(this.today);
});
scenario.Then('I should be told {string}', function (expectedAnswer) {
return this.actualAnswer === expectedAnswer;
});
});
срк / индекс. js
var dummyVar = "";