<p>cucumber-js не находит определения шагов</p>

Созданный на 11 янв. 2017  ·  48Комментарии  ·  Источник: cucumber/cucumber-js

Привет, я новичок, который часами пытался получить cucumber-js, чтобы найти мои определения шагов. Я придумал этот простой пример.

В features / foo.feature:

Feature: Foo
  Scenario: Bar
    Given FooBar

В features / step_definitions / step_defs.js:

var {defineSupportCode} = require('cucumber');

defineSupportCode(function({Given}) {
    Given('FooBar', function () {
      return 'pending';
    });    
});

Получаю такой результат:

Feature: Foo

  Scenario: Bar
  ? Given FooBar

Warnings:

1) Scenario: Bar - features\foo.feature:2
   Step: Given FooBar - features\foo.feature:3
   Message:
     Undefined. Implement with the following snippet:

       Given('FooBar', function (callback) {
         // Write code here that turns the phrase above into concrete actions
         callback(null, 'pending');
       });

1 scenario (1 undefined)
1 step (1 undefined)
0m00.000s
help wanted

Самый полезный комментарий

Хорошо. Думаю, я понял это.

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

Есть ли причина, по которой вы не можете использовать локальную установку для запуска команды? Я делаю это на Mac, добавляя "./node_modules/.bin" в свой путь.

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

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

Все 48 Комментарий

Я знаю, что cucumber-js находит файл определений шагов, потому что, когда я вставляю в него синтаксическую ошибку, cucumber-js правильно сообщает об ошибке.

Какую версию cucumber-js вы используете?

Он говорит 2.0.0-rc.6

Также новичок и такая же проблема с той же версией cucumber.js
Я следил за другим руководством, но на этом застрял.

/features/add-item.feature

Feature: Shopper can add an item to their Grocery List
  As a grocery shopper
  I want to add an item to my grocery list
  So that I can remember to buy that item at the grocery store

  Scenario: Item added to grocery list
    Given I have an empty grocery list
    When I add an item to the list
    Then The grocery list contains a single item

  Scenario: Item accessible from grocery list
    Given I have an empty grocery list
    When I add an item to the list
    Then I can access that item from the grocery list`

/features/step_definitions/add-item.steps.js
'use strict';

module.exports = function() {

    Given('I have an empty grocery list', function (callback) {
         // Write code here that turns the phrase above into concrete actions
         callback(null, 'pending');
       });


    When('I add an item to the list', function (callback) {
         // Write code here that turns the phrase above into concrete actions
         callback(null, 'pending');
       });

    Then('The grocery list contains a single item', function (callback) {
         // Write code here that turns the phrase above into concrete actions
         callback(null, 'pending');
       });

    Then('I can access that item from the grocery list', function (callback) {
         // Write code here that turns the phrase above into concrete actions
         callback(null, 'pending');
       });

}

$ node_modules/.bin/cucumber-js возвращает

Feature: Shopper can add an item to their Grocery List

    As a grocery shopper
    I want to add an item to my grocery list
    So that I can remember to buy that item at the grocery store

  Scenario: Item added to grocery list
  ? Given I have an empty grocery list
  ? When I add an item to the list
  ? Then The grocery list contains a single item

  Scenario: Item accessible from grocery list
  ? Given I have an empty grocery list
  ? When I add an item to the list
  ? Then I can access that item from the grocery list

Warnings:

1) Scenario: Item added to grocery list - features/add-item.feature:6
   Step: Given I have an empty grocery list - features/add-item.feature:7
   Message:
     Undefined. Implement with the following snippet:

       Given('I have an empty grocery list', function (callback) {
         // Write code here that turns the phrase above into concrete actions
         callback(null, 'pending');
       });

2) Scenario: Item added to grocery list - features/add-item.feature:6
   Step: When I add an item to the list - features/add-item.feature:8
   Message:
     Undefined. Implement with the following snippet:

       When('I add an item to the list', function (callback) {
         // Write code here that turns the phrase above into concrete actions
         callback(null, 'pending');
       });

3) Scenario: Item added to grocery list - features/add-item.feature:6
   Step: Then The grocery list contains a single item - features/add-item.feature:9
   Message:
     Undefined. Implement with the following snippet:

       Then('The grocery list contains a single item', function (callback) {
         // Write code here that turns the phrase above into concrete actions
         callback(null, 'pending');
       });

4) Scenario: Item accessible from grocery list - features/add-item.feature:11
   Step: Given I have an empty grocery list - features/add-item.feature:12
   Message:
     Undefined. Implement with the following snippet:

       Given('I have an empty grocery list', function (callback) {
         // Write code here that turns the phrase above into concrete actions
         callback(null, 'pending');
       });

5) Scenario: Item accessible from grocery list - features/add-item.feature:11
   Step: When I add an item to the list - features/add-item.feature:13
   Message:
     Undefined. Implement with the following snippet:

       When('I add an item to the list', function (callback) {
         // Write code here that turns the phrase above into concrete actions
         callback(null, 'pending');
       });

6) Scenario: Item accessible from grocery list - features/add-item.feature:11
   Step: Then I can access that item from the grocery list - features/add-item.feature:14
   Message:
     Undefined. Implement with the following snippet:

       Then('I can access that item from the grocery list', function (callback) {
         // Write code here that turns the phrase above into concrete actions
         callback(null, 'pending');
       });

2 scenarios (2 undefined)
6 steps (6 undefined)
0m00.000s

Файл world.js на данный момент не включен.

@ dunlop-ben, пожалуйста, просмотрите список изменений о разнице между версиями 1.0 и 2.0. Способ определения шагов изменился, и в вашем примере, похоже, используется синтаксис 1.0.

@jeffmath мне все кажется неправильным. У нас есть функциональные тесты, которые подтверждают, что что-то вроде вашего простого примера работает. Воспроизведение на Mac, у меня работает, как и ожидалось. Какую версию узла вы используете? И из путей кажется, что вы находитесь на машине с Windows, это правильно?

@charlierudolph - спасибо. Я изучил это и попробовал несколько разных примеров с аналогичным результатом. Я также пробовал использовать здесь определение функции и шага: http://cucumber.github.io/cucumber-js/

Я чувствую, что мне не хватает шага и / или файлов. Если есть где-нибудь, куда вы можете направить меня, это было бы здорово. Мне не очень повезло с прочтением документации на Github.

@charlierudolph Node 6.4.0 в Windows 7

@charlierudolph У меня аналогичная проблема. Я точно следую https://github.com/cucumber/cucumber-js/blob/master/docs/nodejs_example.md, и проблема все еще возникает.

Моя установка

  • УЗЕЛ 7.4.0
  • ОС: Windows 10
  • Огурец 2.0.0 -rc.6

@jeffmath @TheAdamW извините, но у меня нет Windows-машины, и поэтому я не могу это отследить. Мы используем appveyor для запуска наших тестов на машине с Windows, и я не знаю, в чем будет разница. Не мог бы кто-нибудь из вас попытаться вникнуть в это? Я рад оказать любую помощь, которую смогу

Для меня это работает, если я пишу ./node_modules/.bin/cucumberjs но не пишу только глобально установленный cucumberjs (та же версия 2.0.0-rc.6 ).

Та же ошибка: огурец не может найти определения шагов. Такая же структура папок работает в Linux.

  • УЗЕЛ. 4.4.0 и 4.6
  • ОС: Windows 10
  • Огурец 2.0.0 -rc.6

Есть ли способ принудительно указать путь / папку / шаблон определения шагов?
Кстати, уловка @MartinDelille у меня не сработала.

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

Я запускаю эту функцию, щелкнув правой кнопкой мыши на рубиновой шахте, и из командной строки с помощью команды cucumber -r features/chatstep.feature получаю тот же результат.

Может ли кто-нибудь помочь

Учитывая (/ ^ Я запускаю "([^"] *) "$ /) do | arg1 |
pending # Напишите здесь код, который превращает приведенную выше фразу в конкретные действия
конец

Мне пришлось перейти на версию 1.3.1, чтобы она работала.
Это даже не работает в centos.

25 января 2017 г. в 21:32 "Мритюнджеян С" [email protected] написал:

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

Я запускаю эту функцию, щелкнув правой кнопкой мыши на рубиновой шахте и из командной строки, используя
командой cucumber -r features / chatstep.feature я получаю тот же результат.

Может ли кто-нибудь помочь

-
Вы получили это, потому что прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/cucumber/cucumber-js/issues/718#issuecomment-275224435 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ALjDKMNdggk1Gh-x_q3KRuvlpN5f_0cOks5rV7E9gaJpZM4LhJZO
.

@jbgraug : что

Я пробовал с RC 2.0.6 и RC 2.0.0. Я не мог заставить его работать в Linux или
windows as cucumber не смог найти определения шагов, даже с
параметр -r.

В чт, 26 января 2017 г., в 6:18, Мритюнжеян S [email protected]
написал:

@jbgraug https://github.com/jbgraug : что вы понизили? Что такое Ур
предыдущая версия до перехода на более раннюю версию

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/cucumber/cucumber-js/issues/718#issuecomment-275310070 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ALjDKGbyYXvsjlLv-dlz6bnHMfPK7t05ks5rWCypgaJpZM4LhJZO
.

@jbgraug Я полагаю, что огурец устарел gherkin комплекте с версией 2.0? В настоящее время я устанавливаю 1.3.14, и там написано fetching gherkin чего я никогда не замечал при установке версий выше 2.0.

@ Reach2jeyan на основе вашей командной строки и тестовых фрагментов, я полагаю, вы говорите о огурце-рубине . Хотя эти два проекта связаны в попытке реализовать фреймворк огурца для соответствующих языков, у них есть ряд различий.

@charlierudolph Спасибо, что

Кстати, теперь работает!

@charlierudolph именно то, что сказал @MartinDelille , отлично работает через npm -S с ./node_modules/.bin/cucumber.js , но не через npm -g с /usr/local/bin/cucumber.js , он находит и выполняет шаги, но как-то потом их забывает.

macOS + Node.js 7.5.0 + Cucumber.js 2.0.0-rc.7
Ярлык windows specific вводит в заблуждение

@kozhevnikov спасибо за обновление. Все отчеты до сих пор были в Windows (и мне не удалось воссоздать на моем локальном Mac с локальной установкой) Трудно представить, что глобальная установка каким-то образом отличается, но, по крайней мере, теперь я могу исследовать.

Я получаю те же проблемы в Windows, используя командную строку через cygwin, может быть, это проблема? Я даже скопировал код прямо из примера.

Особенность: простая математика
Чтобы заниматься математикой
Как разработчик
Я хочу увеличить переменные

Сценарий: простая математика
Учитывая, что переменная установлена ​​в 1
Когда я увеличиваю переменную на 1
Тогда переменная должна содержать 2

Схема сценария: гораздо более сложные вещи
Учитывая, что переменная установлена ​​в

Examples:
  | var | increment | result |
  | 100 |         5 |    105 |
  |  99 |      1234 |   1333 |
  |  12 |         5 |     18 |

Cucumber.defineSupportCode (function (context) {
var setWorldConstructor = context.setWorldConstructor;
var Given = context.Given
var When = context.When
var Then = context.Then

///// Твой мир /////
//
// Вызов setWorldConstructor с вашим пользовательским миром (необязательно)
//

var CustomWorld = function () {};

CustomWorld.prototype.variable = 0;

CustomWorld.prototype.setTo = function (number) {
this.variable = parseInt (число);
};

CustomWorld.prototype.incrementBy = function (number) {
this.variable + = parseInt (число);
};

setWorldConstructor (CustomWorld);

///// Ваши определения шагов /////
//
// используйте 'Given', 'When' и 'Then' для объявления определений шагов
//

Учитывая (/ ^ переменную, установленную в (\ d +) $ /, функция (число) {
this.setTo (число);
});

Когда (/ ^ Я увеличиваю переменную на (\ d +) $ /, function (number) {
this.incrementBy (число);
});

Тогда (/ ^ переменная должна содержать (\ d +) $ /, function (number) {
если (this.variable! = parseInt (число))
throw new Error ('Переменная должна содержать' + число +
'но он содержит' + this.variable + '.');
});
})

я получаю эту ошибку «ReferenceError: данный не определен»
Я запускаю cucumber.js и ~ / node_modules / .bin / cucumber.js с определенным именем файла, и он всегда выдает ошибку. Я могу запустить огурец с рубином без проблем, но я не могу заставить огурец работать

Хорошо. Думаю, я понял это.

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

Есть ли причина, по которой вы не можете использовать локальную установку для запуска команды? Я делаю это на Mac, добавляя "./node_modules/.bin" в свой путь.

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

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

Два незначительных момента об удалении глобальной установки:

  1. Все документы потребуют обновления, и не только официальные, но и множество других популярных фреймворков, созданных на их основе. Я следил за этим, когда столкнулся с этим, и было неприятно отлаживать кого-то, кто только начинал с JavaScript / Node.js / Cucumber.js

  2. Многие IDE и плагины жестко запрограммированы так, чтобы указывать на global. Кроме того, добавление переменной среды вне профиля bash (например, запуск WebStorm через Spotlight) в macOS является запутанным и меняется от версии к версии.

Хм. Мы можем добавить опцию CLI, которая позволяет пользователю указать, где находится локальный экземпляр огурца? Мы можем установить значение по умолчанию process.cwd() + /node_modules/cucumber которое должно охватывать большинство случаев.

@charlierudolph Первоначально сообщив об ошибке, я понял, что мне все равно нужно использовать Cucumber-JVM, поскольку код, который мне нужно было протестировать, был написан на Scala.js. Но когда мне в следующий раз понадобится протестировать Javascript, ваш обходной путь будет легко реализовать. Спасибо, что разобрались в проблеме.

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

@jeffmath @kozhevnikov вот мои обновленные мысли по этому

  1. Меня устраивает опция cli, которая позволяет пользователю указать путь к локальному огурцу. Если не указан, он использует исполняемый экземпляр.
  2. Использование этого параметра приведет к проверке версии, чтобы гарантировать, что локальная / глобальная установка является той же самой версией, поскольку в противном случае все может работать не так, как ожидалось. В противном случае будет выдана ошибка, предлагающая пользователю выровнять версии.
  3. Этот вариант будет немедленно исключен и будет сопровождаться предупреждением о необходимости прекратить использование глобальной установки и вместо этого использовать только локальную установку.
  4. Эта опция будет удалена в следующей основной версии.

Я обнаружил аналогичную проблему при создании библиотеки общих тестов. Моя идея - повторно использовать тесты в разных проектах.

Я создал общий пакет тестов под названием _roi-financial-tests_, который я хотел бы использовать в других проектах. Пока что я связал пакет с _npm link_, а затем попытался указать огурец на функции в _roi-financial-tests_, примерно так:

./node_modules/.bin/cucumberjs ./node_modules/roi-functional-tests/features

Но я получаю вот что:

Warnings:

1) Scenario: Curl request - node_modules/roi-functional-tests/features/home.feature:3
   Step: Given I make curl request to "/" - node_modules/roi-functional-tests/features/home.feature:4
   Message:
     Undefined. Implement with the following snippet:

       Given('I make curl request to {arg1:stringInDoubleQuotes}', function (arg1, callback) {
         // Write code here that turns the phrase above into concrete actions
         callback(null, 'pending');
       });

Может ли огурец импортировать определения из-за пределов рабочего каталога?

@jramcast да. Но вам нужно будет использовать флаг --require cli.

Уже пробовал использовать флаг --require :

./node_modules/.bin/cucumberjs --require ./node_modules/roi-functional-tests/features ./node_modules/roi-functional-tests/features

Но я получаю тот же результат.

Возможно, что npm link может быть причиной того, что огурец не может найти определения?

Итак, я проделал тот же тест без npm link . Я опубликовал и установил пакет, и все работает нормально, просто позвонив:

./node_modules/.bin/cucumberjs ./node_modules/roi-functional-tests/features

Я предполагаю, что при связывании пакета require загружает огурец, установленный внутри каталога связанного пакета ( node_modules/roi-functional-tests/node_modules/cucumber ). Однако, если установлен _roi-financial-tests_, npm сглаживает дерево зависимостей и использует экземпляр огурца, установленный прямо под node_modules проекта ( node_modules/cucumber )

Есть такая же проблема.

Версия огурца: "огурец": "^ 2.0.0-rc.9"
Версия для Windows: 10
Версия узла: 6.10.3 LTS и 7.10

Не работает в IDE или глобальном экземпляре огурца, никогда не находит шаги, даже если они реализованы правильно.

Если я вызываю cucumber.js из каталога node_modules проекта, он работает.

У кого-нибудь есть предложения по решению этой проблемы?

Это также происходит в MacOS Sierra 10.12.4.
Версия узла 7.10

Вернулся к Cucumber версии 1.3.0, теперь отлично работает, вызывая его через cmd, используя глобальный экземпляр, И работает в IDE.

Привет @charlierudolph!
Я на следующем этапе. (Из выпуска 60 перенесено сюда)
Я работаю только с локальным экземпляром, но определения моих шагов не распознаются при запуске файла функций
image
Файл функций и файлы определения шага находятся в нужном месте (снимок экрана прилагается)
Почему мой шаг не определен?

У меня была ссылка Cucumber на версии 1.X в package-lock.json
"вдио-огурец-фреймворк":

    "cucumber": {
      "version": "1.3.3",
      "resolved": "https://registry.npmjs.org/cucumber/-/cucumber-1.3.3.tgz",
      "integrity": "sha1-Za+2Xy+T9y2teN8qterPFGCf7C8=",
      "dev": true
    },

"webdriverio-cucumber-js":  

   "cucumber": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/cucumber/-/cucumber-1.2.2.tgz",
      "integrity": "sha1-KEZJEf8arfwOZjTXY2q69mHGaJI="
    },

Я изменил эти две версии на 2,3,1
Моя версия узла - 8.0.0
Но по-прежнему определение шага не распознается
Любая идея?

@vvedachalam

Если вы используете webdriverIO с его средством запуска тестов, а не в автономном режиме, вам НЕОБХОДИМО использовать cucumber-js версии 1.x, предпочтительно 1.3.3, а не 2.x, поскольку средство запуска тестов НЕ поддерживает новую версию. и новый способ реализации определений шагов.

Я вернулся к старому [email protected], так как использую средство запуска тестов, которое требуется для объектной модели страницы и гарантирует, что все команды выполняются синхронно.

@GeeChao
Спасибо за ответ. Я вернулся и запустил тест, но определение шага не распознается

Когда я попробовал команду с -r, я получил ошибку syntex в файле функций ...
C: /webdriverio-test/node_modules/.bin/cucumber-js -r features / customer-validation.feature

C: \ webdriverio-testfeatures \ customer-validation. особенность: 2
Как владелец
^^

SyntaxError: неожиданный идентификатор
в createScript (vm.js: 74: 10)
в Object.runInThisContext (vm.js: 116: 10)
в Module._compile (module.js: 533: 28)
в Object.Module._extensions..js (module.js: 580: 10)
в Module.load (module.js: 503: 32)
в tryModuleLoad (module.js: 466: 12)
в Function.Module._load (module.js: 458: 3)
в Module.require (module.js: 513: 17)
при необходимости (internal / module.js: 11:18)
в C: \ webdriverio-test \ node_modules \ cucumberlib \ cliindex.js: 135: 16
в Array.forEach (собственный)
в Cli.getSupportCodeLibrary (C: \ webdriverio-test \ node_modules \ cucumberlib \ cliindex.js: 134: 24)
в Cli.(C: \ webdriverio-test \ node_modules \ cucumberlib \ cliindex.js: 144: 39)
в Generator.next ()
в Generator.tryCatcher (C: \ webdriverio-test \ node_modules \ bluebird \ js \ release \ util.js: 16: 23)
в PromiseSpawn._promiseFulfilled (C: \ webdriverio-test \ node_modules \ bluebird \ js \ release \ generators.js: 97: 49)

@vvedachalam Не могли бы вы создать и разместить это в своем репо, чтобы я мог его воспроизвести?

@GeeChao
Пожалуйста, посмотрите
https://github.com/vvedachalam/Ruffer-Test

@vvedachalam

Переместите папку step_definitions в папку функций, и она начнет работать и распознает определения шагов. Единственная проблема, возникающая после этого, - неверное расположение файла txtdetails.txt.

@GeeChao
ааа, простите, я не настаивал на этом изменении.
Если вы видите мой скриншот выше, определение шага находится только внутри папки функций.
Содержание надежды будет:
Content = fs.readFileSync ('../../ txndetails.txt', 'utf8');

Тогда почему я не могу приклеить определение шага к файлу функций на моем локальном компьютере?
Моя установка неправильная?

@vvedachalam

Меня устраивает.

Единственное, что я сделал, это переместил step_definitions в каталог функций.

также я сделал npm install [email protected] --save-dev

затем запустил node_modules / cucumber / bin / cucumber.js features /

@GeeChao Все нормально
Я не хочу использовать пример, так как мне нужно выполнить шаг Then на основе данных текстового файла (тест на основе данных)
Я знаю, что этот вопрос не имеет отношения к этой теме, но просто подумал, могу ли я получить некоторую помощь.

@GeeChao Хорошо, это снова моя глупая ошибка. Переменная цикла не была установлена ​​должным образом (забыл сравнить длину). Еще раз спасибо за вашу поддержку

Для меня, как новичка, ошибка была вызвана тем, что я передал в шаги строку, а не регулярное выражение;

Then('I log in as (.*)', ...)

скорее, чем

Then(/I log in as (.*)', ...)

Простая ошибка, но, надеюсь, полезная для кого-то еще, только начинающего.

@vvedachalam Ты разобрался? Не могли бы вы помочь

@ sancy2017 Я перешел на инструмент TestCafe от WDIO. Так что я, возможно, не смогу сразу сказать вам решение. Сообщите мне, с какой именно проблемой вы столкнулись

Простое решение этой ошибки - npm install [email protected] --save-dev
затем запустите свой тест ..npm test

Я столкнулся с той же проблемой: «Определения шага огурца не распознаются». У меня сработало изменение имени каталога с "steps" на "step_definitions".

Я вижу, что в основном у людей есть step_definitions в каталоге функций, я считаю, что лучше всего иметь реализацию шагов в отдельном каталоге, то есть src / step_definitions, вместо того, чтобы хранить шаги в каталоге функций.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги