2015-02-03 2 views
1

나는이 .feature 문이 : 나는 정규식오이 :: ArityMismatchError

를 작성하는

I am logged in as an "Teacher". 
I am logged in as an "Professor". 
I am logged in as an "Student". 
I am logged in as a "NoRole" 

I (\w{2})?\s?(log|login|logged)\s?(\w{2}) as (an|a) "(Teacher|Professor|Student|NoRole)"\.?

나는의 경우 블록을 실행할 수 있도록 나는 따옴표에 넣어했다 그들처럼 :

case role_type 
    when 'Student' 
     on(LoginPage).login_with(FigNewton.Studnet_email,'password') 
and so on ... for other roles 

지금 내가이 정규식을 실행하면 Given

Given(/^I (\w{2})?\s?(log|login|logged)\s?(\w{2}) as (an|a) "(Teacher|Professor|Student|NoRole)"\.?$/) do |user_role| 
    # code 
end 

와 EP 정의는이 오류를 제공합니다 :

Cucumber::ArityMismatchError: Your block takes 1 argument, but the Regexp matched 5 arguments

검색어 : 내가 아는 한, 인수는 "교수"하는, 그래서 다섯 개 인수는 이야기와 같은 따옴표 사이에 그들이다 약.

Cucumber::ArityMismatchError error after Transform에 나는, 단계가 어떤 블록 수 있지만 블록, regex arguments(blocks)

+0

여기의 문제는 [이전 질문] (http://stackoverflow.com/questions/3450137/cucumberaritymismatcherror-error-after-transform)과 동일합니다. 인수는 Regexp에 의해 반환 된 캡처 그룹입니다. 캡쳐 그룹은 인용문이 아니라 대괄호로 표시됩니다. 즉, arguements/groups는'(\ w {2})','(log | login | logged)','(\ w {2})','(| a)','(선생님 | 교수님 | 학생 | NoRole) '과 같이 말입니다. 다른 질문의 대답과 동일한 접근법이 필요합니다. 즉, 캡처하지 않는 그룹을 캡처하거나 만들지 마십시오. –

+0

@JustinKo thats 내가 질문을 게시 한 이유 ** 정규식 인수 (블록)에서 역할 유형을 분리하는 방법 ** 내 정규 표현식이 작동하지 않습니다. ** – paul

+0

당신은 ' (? : an | a)와 같이 (/^I (? : \ w {2})? \ s (?: 로그인 | 로그 됨) \ s? "\.? $ /)' –

답변

2

에서 어떻게 분리하는 역할 유형이없는 경우 내 regex 실 거예요 작업 오류 메시지가 말한대로 안된다고 발견 정의에는 하나의 인수 - user_role이 필요합니다. 그러나, 당신은 당신이 (5 개) 인수를 전달하는 의미, 5 개 그룹을 캡처 :

  • 가 ({2} 승 \) (로그인 | 로그인 | 기록)
  • (\ {2} w)
  • (AN | A)
  • (교사 | 교수 | 학생 | NoRole)

당신이 마지막 그룹, (Teacher|Professor|Student|NoRole), 다른 4 개 개의 그룹이 비 캡처 그룹으로 표시해야 원하는 것을 감안할 때. 이것은 개구 괄호 후 ?:를 추가 할 경우 : "소유자"역할은 USER_ROLE 군으로부터 누락 된 (이상 첨가)

Given(/^I (?:\w{2})?\s?(?:log|login|logged)\s?(?:\w{2}) as (?:an|a) "(Teacher|Professor|Student|NoRole|Owner)"\.?$/) 

참고있다. 이 단계는 예상되는 5 단계 모두와 일치합니다.

1

질문의 주제를 조금 벗어나지 만, 이와 같은 단계 정의를 작성하지 마십시오. 고통 스럽습니다. 오이 사용자가 만드는 가장 큰 실수 중 하나는 단계 정의를 DRY로 만드는 것입니다. 얼마나 많은 단계 정의가 있더라도 상관 없습니다. 중요한 것은 단계 정의의 내용이 DRY라는 것입니다. 헬퍼 메서드를 호출하여이를 수행 할 수 있습니다. 귀하의 경우에는

난 그냥 구현하는 것이

Given "I am logged in as a teacher" do 
    login_as :teacher 
end 

and then implement 

module LoginStepHelper 
    def login_as(user_type) 
    ... 
    end 
end 
World LoginStepHelper 

이 메서드를 호출 20여 단계의 정의가있는 경우에만 하나의 구현을 가지고 있기 때문에 당신은 당신을 로그인 방식을 변경하는 경우 그래서, 문제가되지 않습니다 한 가지만 바꾸면됩니다. 또한 단계 정의가 매우 간단하므로 특정 구문이 일치하지 않는 이유를 디버깅하는 데 시간을 낭비하지 않아도됩니다.

는 지금은

Given "I am logged in as a teacher" do 
    login_as :teacher 
end 

Given "I log in as a teacher" do 
    login_as :teacher 
end 

Given "I am logged in as a artist" do 
    login_as :artist 
end 

... 

예를 조금 지루한 될 수있는 아주 행복 해요,하지만 각각의 하나는 명확하고 간단하며 새로운 언어를 충족하기 위해 새로운 것을 만드는 것은 사용하는 것입니다 예를 들어, 사소한

Given "I am signed in as a artist" do 
    login_as :artist 
end 

거대한 복잡한 정규 표현식을 수정해야하는 위험과 비교하십시오.