Skip to content

Given and When with same step argument names causes incorrect argument value to be used in when step #507

@silygose

Description

@silygose
from pytest_bdd import scenarios, parsers, given, when, then
from my_pytest_bdd.cucumbers import CucumberBasket

# Scenarios

CONVERTERS = {
    'initial': int,
    'some': int,
    'total': int,
}

scenarios('../features')

# Given Steps

@given(parsers.parse('the basket has {initial:d} cucumbers'), target_fixture='basket')
def basket(initial):
    return CucumberBasket(initial_count=initial)

@given(parsers.parse('the color is "green"'))
@given('the color is "green"')
def is_green(basket):
    assert 'green' == 'green'

@given(parsers.parse('{some:d} {color} {size} cucumbers are added to the basket'))
def call_add_cucumber(basket, some, color, size):
    print('parse GIVEN can calling call_add_cucumber()')
    add_cucumbers(basket, some, color, size)

# When Steps
@when(parsers.parse('{some:d} {color} {size} cucumbers are added to the basket'))
@when(parsers.parse('{some:d} "{color}" "{size}" cucumbers are added to the basket'))
@when(parsers.parse('{some:d} "{color}" {size} cucumbers are added to the basket'))
@when(parsers.parse('{some:d} {color} "{size}" cucumbers are added to the basket'))
def add_cucumbers(basket, some, color, size):
    print('parsing WHEN in add_cucumbers()')
    print(f'some {some}')
    print(f'color: {color}')
    print(f'size: {size}')

    assert color == 'green'
    assert size == 'long'

    basket.add(some)

@when(parsers.parse('{some:d} cucumbers are removed from the basket'))
def remove_cucumbers(basket, some):
    basket.remove(some)

# Then Steps

@then(parsers.parse('the basket contains {total:d} cucumbers'))
def basket_has_total(basket, total):
    assert basket.count == total
@cucumber-basket @basket @add
Feature: Cucumber Basket with Outlines
  As a gardener,
  I want to carry multiples of cucumbers in a basket,
  So that I don't drop any of them.
  
  @add_good
  Scenario Outline: Add cucumbers to a basket 1
    Given the basket has <initial> cucumbers
    And the color is "green"
    When <some> "green" "long" cucumbers are added to the basket
    Then the basket contains <total> cucumbers

    Examples:
      | initial | some | total |
      | 0       | 3    | 3     |

  @add_bad
  Scenario Outline: Add cucumbers to a basket 2
    Given the basket has <initial> cucumbers
    And <some> <color> long cucumbers are added to the basket
    When <some> "green" "long" cucumbers are added to the basket
    And <some> "green" long cucumbers are added to the basket
    Then the basket contains <total> cucumbers
    
    Examples:
      | initial | some | color | total |
      | 0       | 2    | green | 6     |
$ pytest -vv -s -m add_good

basket = <my_pytest_bdd.cucumbers.CucumberBasket object at 0x00000250F5393688>, some = 3, color = '"green"', size = '"long"'

    @when(parsers.parse('{some:d} {color} {size} cucumbers are added to the basket'))
    @when(parsers.parse('{some:d} "{color}" "{size}" cucumbers are added to the basket'))
    @when(parsers.parse('{some:d} "{color}" {size} cucumbers are added to the basket'))
    @when(parsers.parse('{some:d} {color} "{size}" cucumbers are added to the basket'))
    def add_cucumbers(basket, some, color, size):
        print('parsing WHEN in add_cucumbers()')
        print(f'some {some}')
        print(f'color: {color}')
        print(f'size: {size}')

>       assert color == 'green'
E       assert '"green"' == 'green'
E         - green
E         + "green"
E         ? +     +

cucumber\steps\test_cucumber_steps.py:53: AssertionError

If comment out @given(parsers.parse('{some:d} {color} {size} cucumbers are added to the basket')) then running test for -m add_good passes and causes -m add_bad to fail:

E               pytest_bdd.exceptions.StepDefinitionNotFoundError: Step definition is not found: Given "2 green long cucumbers are added to the basket". Line 21 in scenario "Add cucumbers to a basket 2" in the feature "C:\Users\valorosc\Documents\MyPython\my_pytest_bdd\cucumber\features\cucumbers_add.feature"

Changing given step to:

@given(parsers.parse('{some:d} {hue} {length} cucumbers are added to the basket'))
def call_add_cucumber(basket, some, hue, length):
    print('parse GIVEN can calling call_add_cucumber()')
    add_cucumbers(basket, some, hue, length)

Both add_good and add_bad pass.

Looks like value for argument is getting from given instead of when step.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions