cucumber icon indicating copy to clipboard operation
cucumber copied to clipboard

Failure with a stacktrace from inside cucumber

Open vorner opened this issue 8 years ago • 3 comments

It seems I have a too new cucumber or something. When I run the tests, it fails with a stack trace somewhere deep within cucumber itself.

I don't know ruby and I'm not familiar with cucumber much (definitely not with its internals), but if I was to make a guess, I'd say it expects a groups field in some answer which is not being provided. I have cucumber 3.0.1.

Feature: Calling steps within steps

  Background:                                   # features/feature_features/calling_steps.feature:3
    Given a project if I don't already have one # features/step_definitions/project_steps.rs:16
    And the steps                               # features/step_definitions/project_steps.rs:25
      """
        When!(c, "^I get invoked indirectly$", |_, _, ()| {
          panic!("Indirect step got invoked!");
        });

        When!(c, "^I invoke a step indirectly$", |cuke: &Cucumber<u32>, world: &mut u32, ()| {
          cuke.invoke("I get invoked indirectly", world, None);
        });
      """
    Then the project compiles                   # features/step_definitions/project_steps.rs:36

  Scenario: Invoking a step indirectly                       # features/feature_features/calling_steps.feature:17
    When the following feature is executed                   # features/step_definitions/project_steps.rs:50
      """
        Feature: Invoking step indirectly
          Scenario: Invoking
            When I invoke a step indirectly
      """
undefined method `group' for #<Cucumber::StepArgument:0x00005592f4344ba8> (NoMethodError)
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/step_match.rb:70:in `block in replace_arguments'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/step_match.rb:69:in `each'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/step_match.rb:69:in `replace_arguments'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/step_match.rb:47:in `format_args'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/formatter/console.rb:42:in `format_step'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/formatter/pretty.rb:158:in `step_name'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/formatter/ignore_missing_messages.rb:11:in `method_missing'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/formatter/legacy_api/ast.rb:169:in `print_step_name'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/formatter/legacy_api/ast.rb:114:in `accept'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/formatter/legacy_api/adapter.rb:580:in `step_invocation'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/formatter/legacy_api/adapter.rb:543:in `step_invocation'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/formatter/legacy_api/adapter.rb:387:in `print_step'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/formatter/legacy_api/adapter.rb:251:in `after_test_step'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/formatter/legacy_api/adapter.rb:107:in `after_test_step'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/formatter/legacy_api/adapter.rb:31:in `block in initialize'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/event_bus.rb:34:in `block in broadcast'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/event_bus.rb:34:in `each'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/event_bus.rb:34:in `broadcast'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/event_bus.rb:40:in `method_missing'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/test/runner.rb:35:in `around_hook'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/test/around_hook.rb:12:in `describe_to'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/test/case.rb:120:in `block (2 levels) in compose_around_hooks'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/test/case.rb:121:in `compose_around_hooks'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/test/case.rb:26:in `block in describe_to'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/test/runner.rb:19:in `test_case'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/test/case.rb:25:in `describe_to'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/filters/prepare_world.rb:12:in `test_case'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/test/case.rb:25:in `describe_to'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/filter.rb:57:in `test_case'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/filters/retry.rb:18:in `test_case'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/test/case.rb:25:in `describe_to'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/filters/quit.rb:12:in `test_case'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/test/case.rb:25:in `describe_to'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/filters/broadcast_test_run_started_event.rb:20:in `block in done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/filters/broadcast_test_run_started_event.rb:19:in `map'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/filters/broadcast_test_run_started_event.rb:19:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/filter.rb:62:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/filter.rb:62:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/filter.rb:62:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/filter.rb:62:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/filter.rb:62:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/filter.rb:62:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/filter.rb:62:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/test/filters/locations_filter.rb:20:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/filter.rb:62:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/test/filters/tag_filter.rb:18:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/compiler.rb:24:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/gherkin/parser.rb:37:in `done'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core.rb:32:in `parse'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core.rb:21:in `compile'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/runtime.rb:74:in `run!'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/lib/cucumber/cli/main.rb:33:in `execute!'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-3.0.1/bin/cucumber:9:in `<top (required)>'
/usr/bin/cucumber:9:in `load'
/usr/bin/cucumber:9:in `<main>'
error: test failed, to rerun pass '--test cuke'

When I downgrade to cucumber 2.4.0, I get a different error:

     Running target/debug/deps/cuke-5a76953049b7bcad
wrong number of arguments (given 0, expected 1) (ArgumentError)
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-core-3.1.0/lib/cucumber/core/report/summary.rb:8:in `initialize'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-2.4.0/lib/cucumber/runtime.rb:178:in `new'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-2.4.0/lib/cucumber/runtime.rb:178:in `summary_report'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-2.4.0/lib/cucumber/runtime.rb:172:in `report'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-2.4.0/lib/cucumber/runtime.rb:64:in `run!'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-2.4.0/lib/cucumber/cli/main.rb:32:in `execute!'
/usr/lib64/ruby/gems/2.3.0/gems/cucumber-2.4.0/bin/cucumber:8:in `<top (required)>'
/usr/bin/cucumber:9:in `load'
/usr/bin/cucumber:9:in `<main>'
error: test failed, to rerun pass '--test cuke'

What is the „supported“ version?

vorner avatar Dec 09 '17 15:12 vorner

TL;DR: I've not nothing yet, but here are some links to start looking with.

The intent is to support the latest version. Looking into this error but... man reading cucumber source is painful. Here's where I'm at so far:

group = step_argument.group from: https://github.com/cucumber/cucumber-ruby/blob/master/lib/cucumber/step_match.rb#L73

def initialize(step_definition, step_name, step_arguments) from: https://github.com/cucumber/cucumber-ruby/blob/master/lib/cucumber/step_match.rb#L10

result << StepMatch.new(step_definition, name_to_match, arguments) from: https://github.com/cucumber/cucumber-ruby/blob/88fe6414de548ad84c81c699911b246b8f979abd/lib/cucumber/glue/registry_and_more.rb#L67

The provided "arguments" are supposed to be StepDefinitions. I diverged from here to just try to find some type that has a group "method" or "value"

https://github.com/cucumber/cucumber-ruby/search?utf8=%E2%9C%93&q=group&type=

... And I came up empty. No method called "group" and no field called "group". I suspect that there may be something serialized (coming from upstream cucumber server?) that has this field. Lack of types in Ruby is really painful.

acmcarther avatar Dec 10 '17 21:12 acmcarther

Yes, that's what I think too.

I had the idea of looking at some other language with a wire server how it does that (spy on it through wireshark), but so far I didn't manage to set anything working up yet.

vorner avatar Dec 11 '17 20:12 vorner

Hmm. This one fails with the same exact error: https://github.com/cucumber/cucumber-cpp. How probable is it that nobody really uses the wire protocol and it was not tested and it is a bug in cucumber itself?

vorner avatar Dec 11 '17 20:12 vorner