Capybara를 사용하여 쿼리 문자열로 현재 경로를 얻는 방법


144

페이지 URL은 capybara의 메소드를 /people?search=name 사용 current_path하는 동안 과 비슷 /people합니다.

current_path.should == people_path(:search => 'name')

그러나 그것은 말하는 데 실패합니다

expected: "/people?search=name"
got: "/people"

우리가 어떻게 그것을 통과시킬 수 있습니까? 이를 수행 할 수있는 방법이 있습니까?


10
"/people?search=name" 경로가 아닙니다 . "/people"경로입니다
Andrei Botalov

답변:


212

capybara의 현대적인 규칙을 반영하기 위해이 답변을 업데이트했습니다. 나는 이것이 대답으로 받아 들여지고 솔루션을 찾을 때 많은 사람들이 언급하고 있기 때문에 이것이 이상적이라고 생각합니다. 현재 경로를 확인하는 올바른 방법은 has_current_path?여기에 설명 된대로 Capybara에서 제공 하는 매처 를 사용하는 것입니다. 여기를 클릭 하십시오.

사용법 예 :

expect(page).to have_current_path(people_path(search: 'name'))

설명서에서 볼 수 있듯이 다른 옵션을 사용할 수 있습니다. 현재 페이지가 /people?search=name있지만 /people매개 변수에 관계없이 해당 페이지 에만 관심이 있다면 only_path옵션을 보낼 수 있습니다.

expect(page).to have_current_path(people_path, only_path: true)

또한 전체 URL을 비교하려는 경우 :

expect(page).to have_current_path(people_url, url: true)

이 방법을 지적한 Tom Walpole의 의견입니다.


4
아마도이 구문이 곧 필요할 것입니다. 레거시 응용 프로그램에 대한 테스트를 작성하고 있습니다. 사용 current_path.should ==은 현재 작동 중입니다 (후행 슬래시를 문자열로 추가해야하지만). 필요한 코드에 대해 미리 감사드립니다.
Tass

3
URI.parse(current_url).request_uri더 간결합니다. @Lasse Bunk의 답변을 참조하십시오.
Richard Jones

Capybara 2.5부터는 더 이상 최선의 대답이 아닙니다. 아래 @ tom-walpole의 답변을 참조하십시오.
dkniffin

질문자가 수락 된 답변을 변경할 가능성이 없으므로 현대를 반영하도록 답변을 업데이트했습니다. 이는 솔루션을 찾고 첫 번째 답변을 보는 새로운 사용자에게 도움이됩니다. 지적 해 주셔서 감사합니다 @OddityOverseer
nzifnab

1
새로운 Capybara 버전의 경우ignore_query: trueonly_path: true
Alexander

92

전체 URL을 매개 변수와 비교하기 위해 _path 메소드를 _url로 바꿨습니다.

current_url.should == people_url(:search => 'name')

4
호스트 부분을 어떻게 다루었습니까?
Chris Nicola

11
당신은 또한 사용할 수있는 current_path카피 바라의 최신 버전과 대조를 일치people_path(...)
제이슨 스터 크

경로 이름을 지정하지 않으면 ... / users / register 만 있습니다 ... 어떻게 사용해야합니까?
Gopal S Rathore

URL이 HTML 페이지와 다르도록 렌더링에서 발생하면 어떻게 되나요?
bigpotato

52

현대 에이 질문을 업데이트하십시오. Capybara 2.5 이상을 사용할 때 current_paths를 확인하는 가장 좋은 방법은 current_path 매처를 사용하는 것입니다. current_path 매처는 Capybaras 대기 동작을 사용하여 경로를 확인합니다. request_uri (경로 ​​및 쿼리 문자열)를 확인하려는 경우

expect(page).to have_current_path(people_path(:search => 'name'))  

경로 부분 만 원할 경우 (쿼리 문자열 무시)

expect(page).to have_current_path(people_path, only_path: true) # Capybara < 2.16
expect(page).to have_current_path(people_path, ignore_query: true) # Capybara >= 2.16

전체 URL과 일치 시키려면

expect(page).to have_current_path(people_url, url: true) # Capybara < 2.16
expect(page).to have_current_path(people_url) # Capybara >= 2.16

매처는 == 또는 정규 표현식과 비교할 문자열을 가져옵니다.

expect(page).to have_current_path(/search=name/)

4
이러한 현대에이 같이 표시되어야 대답. 이렇게하면 모호한 타이밍 문제가 많이 발생합니다. 감사합니다!
Ax

1
@Vanuan rspec은 should구문을 더 이상 사용하지 않습니다 . expect().to앞으로 사양 에 사용하도록 노력해야합니다 .
nzifnab

1
only_path: true지금ignore_query: true
srghma

18

답변이 선택되었음을 알고 있지만 대안 솔루션을 원했습니다. 그래서:

request.fullpathRails에서 와 같이 경로와 쿼리 문자열을 얻으려면 다음을 수행하십시오.

URI.parse(current_url).request_uri.should == people_path(:search => 'name')

다음과 같이 테스트 클래스에서 도우미 메소드를 수행 할 수도 있습니다 (예 ActionDispatch::IntegrationTest:).

def current_fullpath
  URI.parse(current_url).request_uri
end

도움이 되었기를 바랍니다.


1

편집 : Tinynumberes가 언급했듯이 포트 번호가있는 URL에서는 실패합니다. 다른 사람이 같은 훌륭한 아이디어를 가지고있는 경우를 대비하여 여기에 보관하십시오.

current_url[current_host.size..-1]

와 마찬가지로 정확히 35 자 (35 자)로 골프를 URI.parse(current_url).request_uri하지만 명시적인 URI 구문 분석이 없기 때문에 잠재적으로 더 빠릅니다.

https://github.com/jnicklas/capybara/pull/1405 에서 Capybara에 이것을 추가하기위한 풀 요청을했습니다.


current_url포트 번호가 포함되어 있으면 작동하지 않습니다 . 예를 들면 소정 current_url의를 http://foo.com:8888/some/path, current_url[current_host.size..-1]동일 할 것이다 :8888/some/path. 또한 무대 뒤에서 @nzifnab이 허용 된 답변에서 권장 current_host하는 것과 동일한 종류의 URI.parse논리를 수행합니다.
Tinynumbers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.