적절한 오류 메시지와 함께 Capybara를 사용하여 요소 수를 주장하는 방법은 무엇입니까?


86

카피 바라에서는 다음과 같이 할 수 있습니다.

page.should have_css("ol li", :count => 2)

그러나 페이지에 일치하는 요소가 하나만 있다고 가정하면 오류는 그다지 설명 적이 지 않습니다.

  1) initial page load shows greetings
 Failure/Error: page.should have_css("ol li", :count => 2)
 expected css "ol li" to return something

이 다소 모호한 오류 메시지 대신 오류 출력이 'When matching'ol li ', expected : 2, found : 1'과 같은 방식으로 어설 션을 작성하는 방법이 있습니까? 분명히 그러한 행동에 대한 사용자 지정 논리를 직접 만들 수 있습니다.이 작업을 '즉시'수행 할 수있는 방법이 있는지 묻습니다.

그만한 가치를 위해 Selenium 드라이버와 RSpec을 사용하고 있습니다.


사람들이 알다시피 "page.should have_css ("ol li ", : count => 2)"는 카피 바라에서 구현되었습니다. 나는 그것이 범위와 함께 매우 유용하다고 생각한다 : within ( "ol.users-list") do page.should have_css ( 'li', : count => 3) end
rafaelkin 2013-04-18

@rafaelkin, 명확히하기 위해 : 카피 바라는 이제 예를 들어 요소 수의 불일치를 더 자세히보고합니까? 나는 카피 바라를 한동안 따르지 않았지만 그 당시의 문제는 오류 메시지의 형식에 관한 page.should have_css("ol li", :count => 2)것이지 이미 구현되지 않았을 것입니다.
merryprankster 2013

여러분, 저는 현재 받아 들여진 답변 (= 나의 답변)이 더 이상 최고가 아니라는 느낌이 들지만 제안 된 솔루션 중 어떤 것이 최고인지 평가할 시간이 없습니다 (더 이상 Ruby와 함께 작동하지 않음). 원래 문제를 다루는 주장의 출력이 포함되어 있기 때문에 Richard의 대답에 대한 수용된 대답을 변경하겠습니다.
merryprankster 2013 년

답변:



22

기본적으로 지원되지 않는 것처럼 보이므로 다음 사용자 지정 일치자를 작성했습니다.

RSpec::Matchers.define :match_exactly do |expected_match_count, selector|
    match do |context|
        matching = context.all(selector)
        @matched = matching.size
        @matched == expected_match_count
    end

    failure_message_for_should do
        "expected '#{selector}' to match exactly #{expected_match_count} elements, but matched #{@matched}"
    end

    failure_message_for_should_not do
        "expected '#{selector}' to NOT match exactly #{expected_match_count} elements, but it did"
    end
end

이제 다음과 같은 작업을 수행 할 수 있습니다.

describe "initial page load", :type => :request do
    it "has 12 inputs" do
        visit "/"
        page.should match_exactly(12, "input")
    end
end

다음과 같은 출력을 얻습니다.

  1) initial page load has 12 inputs
     Failure/Error: page.should match_exactly(12, "input")
       expected 'input' to match exactly 12 elements, but matched 13

지금은 트릭을 수행합니다.이 부분을 카피 바라로 만드는 방법을 살펴 보겠습니다.


카피 바라이 고정처럼 보인다는 간단하지 않다 : github.com/jnicklas/capybara/issues/331
merryprankster

14

나는 다음이 더 간단하고 상당히 명확한 출력을 제공하며 커스텀 매 처가 필요 없다고 생각합니다.

page.all("ol li").count.should eql(2)

그러면 오류가 표시됩니다.

      expected: 2
       got: 3

  (compared using eql?)
  (RSpec::Expectations::ExpectationNotMetError)

9
이것은 예를 들어 아직 보류중인 ajax 요청이있을 때 예상이 이루어지기를 기다리지 않습니다.
Clemens Helm

9

편집 : @ThomasWalpole이 지적했듯이 사용 all하면 Capybara 의 대기 / 재 시도가 비활성화되므로 위의 @pandaPower의 답변이 훨씬 좋습니다.

이건 어때?

  within('ol') do
    expect( all('.opportunity_title_wrap').count ).to eq(2)
  end

2
이것은 Capybaras 대기 / 재 시도를 완전히 없애고 절대 권장되는 솔루션이되어서는 안됩니다.
Thomas Walpole

@ThomasWalpole 당신이 무슨 말을하는지 잘 모르겠습니다. 어떤 식 으로든 다른 요소 내에서 요소를 찾는 것은 Capybara에서 대기 / 재 시도를 어떻게 만듭니 까?
Constant Meiring 2017-06-07

2
@ConstantMeiring 그것은 within, 그것은 대기 / 재 시도를 비활성화 .count하는 결과를 호출 all합니다. count결과 all(빈 "배열"이 유효한 반환 값임)를 호출 하여 정수로 변환하고 비교합니다. 해당 비교가 실패하면 예상이 실패합니다. 대신에 Capybara의 매처 중 하나에 count 옵션을 전달하면 capybara는 카운트 옵션이 일치 할 때까지 (또는 Capybara.default_max_wait_time이 만료 될 때까지) 지정된 선택기를 찾기를 기다리거나 다시 시도합니다.
Thomas Walpole

4

Capybara에서 권장하는 현재 (2013 년 9 월 2 일) 모범 사례는 다음과 같습니다 ( 소스 ).

page.assert_selector('p#foo', :count => 4)


-4

@pandaPower의 대답은 매우 좋지만 구문이 약간 달랐습니다.

expect(page).to have_selector('.views-row', :count => 30)

5
해시 로켓을 사용하는 것은 "다른 구문"으로 간주되지 않습니다.
premjg 2014

2
나는 루비 개발자가 아니며 두 구문이 동일하다는 것을 깨닫지 못했습니다. TBH 나는 그것이 반대 투표를 정당화하는지 확신하지 못합니다. 유효한 대안입니다. Ruby 배경이 아닌 사람들에게는 명확하지 않을 수 있습니다. 나를위한 것이 아니었다.
Nick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.