문제

오이 단계를 재사용하고 싶지만 올바른 방법을 찾을 수없는 것 같습니다.

다음과 같은 단계를 작성하고 싶습니다.

Given /^I login with (.*) credentials$/ |type|
  # do stuff with type being one of "invalid" or "valid"
end

그러나 다음과 같은 또 다른 단계가 있습니다.

Given /^I login successfully$
  # call "Given I login with valid credentials"
end

따라서 사용자 인증을 테스트 할 때 전자를 사용할 수 있지만 대부분의 다른 장소는 후자를 사용할 수 있으며 실제로 코드를 재현 할 필요는 없습니다.

다른 단계를 호출 할 수있는 방법이 있습니까, 아니면 로직을 도우미 메소드에 넣고 각 작업에서 상기 메소드를 호출합니까 (기본적으로 메소드 추출 리팩토링, 내 질문을 읽은 후에는 그것이 실제로 가장 좋은 방법이라고 믿게합니다. 그래도)?

도움이 되었습니까?

해결책

업데이트: 아래에 설명 된 방법은 더 이상 사용되지 않았습니다. 이제 다른 단계에서 단계를 호출하는 권장 방법은 다음과 같습니다.

Given /^I login successfully$/
    step "I login with valid credentials" 
end 

오래된 감가 상각 된 방법 (참조) :

다음과 같은 다른 단계에서 단계를 호출 할 수 있습니다.

Given /^I login successfully$/
  Given "I login with valid credentials"
  Then "I should be logged in"
end

기능 내의 모든 시나리오 에이 (또는 다른 단계)가 필요한 경우 다음과 같은 일반적인 단계와 함께 각 기능에 배경을 추가 할 수도 있습니다.

Background:
  Given I log in with valid credentials

Scenario: Change my password
  Given I am on the account page

다른 팁

최근 버전의 오이에서 단계 내에서 단계를 호출하는 방법이 변경되었으며, "경고 : '주어진/언제/when'사용과 같은 오류가 발생하는지 알 수 있습니다. 대신 다른 단계를 호출하십시오 :/path/to/step_definitions/foo_steps.rb : 631 : in`block in ' ". 참조 오이 위키 자세한 내용은.

변화의 요점은 이제 사용해야한다는 것입니다. step 또는 steps 행동 양식.

When /^I make all my stuff shiny$/
  step "I polish my first thing"
end

When /^I make all my stuff shiny$/
  steps %Q{
    When I polish my first thing
    When I shine my second thing
  }
end

단계 정의에서 단계를 호출하는 것은 나쁜 연습이며 일부 단점:

  1. 시나리오가 실패하고 중첩 된 단계 호출이 있으면 스택 추적에서 마지막으로 호출 된 단계 정의 만 얻게됩니다. 마지막 stumdef라고 불리는 곳에서 찾기가 어려울 수 있습니다.
  2. STEPDEF 로의 전화는 때때로 루비 방법보다 찾아서 읽기가 더 어렵습니다.
  3. Ruby Methods는 STEP DEFS에서 단계를 호출하는 것보다 더 많은 힘을줍니다.

Aslak Hellesøy 추천합니다 대중적인 행동을 추출합니다 세계 단계를 재사용하는 대신. 해당 작업을 한 곳에서 분리 하고이 코드를 쉽게 찾을 수 있습니다. 일반적인 루비 클래스 또는 모듈에도 코드를 추출 할 수도 있습니다.

#/support/world_extensions.rb
module KnowsUser
  def login
    visit('/login')
    fill_in('User name', with: user.name)
    fill_in('Password', with: user.password)
    click_button('Log in')
  end

  def user
    @user ||= User.create!(:name => 'Aslak', :password => 'xyz')
  end
end
World(KnowsUser)

#/step_definitions/authentication_steps.rb
When /^I login$/ do
  login
end

Given /^a logged in user$/ do
  login
end

오이 메일 링리스트의 주제에 대한 유용한 토론은 다음과 같습니다. 링크

인용문 대신 단계를 %{}로 가장 잘 랩핑하십시오. 그런 다음 자주 사용해야 할 이중 인용문을 피할 필요가 없습니다.

Given /^I login successfully$
  step %{I login with valid credentials}
end

Given /^I login with (.*) credentials$/ |type|
  # do stuff with type being one of "invalid" or "valid"
end

코드 재사용 성을 제공하는 기능 파일의 키워드를 재사용합니다.

STEP DEFS 내에서 STEP DEFS를 호출하는 것은 권장되지 않습니다.

내 기능 파일을 이런 식으로 쓸 것입니다.

Scenario Outline: To check login functionality
    Given I login with "<username>" and "<password>"
    Then I "<may or may not>" login successfully

Examples:
    |username|password|may or may not|
    |paul    |123$    |may           |
    |dave    |1111    |may not       |

내 단계 정의에서 (이것은 자바입니다)

@Given(I login with \"([^\"]*)\" and \"([^\"]*)\"$)
public void I_login_with_and(String username, String password){

   //login with username and password

}

@Then(I \"([^\"]*)\" login successfully$)
public void I_login_successully_if(String validity){

    if(validity.equals("may")){
        //assert for valid login
    }
    else
    if(validity.equals("may not")){
        //assert for invalid login
    }
}

이런 식으로 많은 코드 재사용 성이 있습니다. 동일한 주어진 다음 유효하고 유효하지 않은 시나리오를 모두 처리합니다. 동시에 기능 파일은 독자에게 적합합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top