문제
오이 단계를 재사용하고 싶지만 올바른 방법을 찾을 수없는 것 같습니다.
다음과 같은 단계를 작성하고 싶습니다.
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
단계 정의에서 단계를 호출하는 것은 나쁜 연습이며 일부 단점:
- 시나리오가 실패하고 중첩 된 단계 호출이 있으면 스택 추적에서 마지막으로 호출 된 단계 정의 만 얻게됩니다. 마지막 stumdef라고 불리는 곳에서 찾기가 어려울 수 있습니다.
- STEPDEF 로의 전화는 때때로 루비 방법보다 찾아서 읽기가 더 어렵습니다.
- 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
}
}
이런 식으로 많은 코드 재사용 성이 있습니다. 동일한 주어진 다음 유효하고 유효하지 않은 시나리오를 모두 처리합니다. 동시에 기능 파일은 독자에게 적합합니다.