8

Tôi đã nâng cấp toàn bộ ngăn xếp của mình từ dự án dựa trên Rails 3.0 lên 3.1. Tôi có thông số kỹ thuật nhưng các tính năng của tôi hiện đang hơi khó tính. Vấn đề Tôi hiện đang có là bước này:Capybara: Cách xác nhận số lượng phần tử đã cho tồn tại

Then /^I should see (\d+) menu item(?:s)? within "([^"]*)"$/ do |count, selector| 
    page.find(:css, selector, :count => count.to_i) 
end 

Và trong các tính năng riêng của mình, tôi có thể đặt:

Then I should see 5 menu items within "tr#menu_item_row" 

các thông điệp mà tôi nhận được là:

Then I should see 5 menu items within "tr#menu_item_row"          # features/step_definitions/admin_menu_steps.rb:1 
    Ambiguous match, found 5 elements matching css "tr#menu_item_row" (Capybara::Ambiguous) 
    ./features/step_definitions/admin_menu_steps.rb:2:in `/^I should see (\d+) menu item(?:s)? within "([^"]*)"$/' 
    features/admin_menu.feature:30:in `Then I should see 5 menu items within "tr#menu_item_row"' 

As far như tôi có thể nói, 5 yếu tố phù hợp với 5 yếu tố thực sự được tìm thấy. Tôi đã viết mã này sai hay có điều gì đó thay đổi lớn? Cảm ơn!

Trả lời

14

Nếu bạn muốn kiểm tra 5 yếu tố bạn không nên sử dụng #find theo mặc định vì Capybara 2.0 phương pháp này luôn ném ngoại lệ nếu tìm thấy nhiều hơn hoặc ít hơn một phần tử. Đây là một ý định và (tôi tin) một sự thay đổi tốt.

Để khẳng định rằng 5 yếu tố có mặt một phương pháp thích hợp là một khớp rspec:

expect(page).to have_css(selector, count: count.to_i) 

tôi không khuyên bạn nên to set match to prefer_exact theo khuyến cáo của @fontno như trong hầu hết các tình huống bạn muốn Capybara để ném một ngoại lệ nếu find tìm thấy nhiều hơn một phần tử.

2

Có, đây là thay đổi giữa các phiên bản 1.x và 2.x. Bạn có thể xem tất cả các thay đổi trong số capybara upgrade guide và số này blog post.

Phương thức find hiện tăng lỗi ambiguous match nếu tìm thấy nhiều hơn một phần tử. Nếu bạn chỉ có một vài ví dụ bạn có thể làm một cái gì đó như thế này

Then /^I should see (\d+) menu item(?:s)? within "([^"]*)"$/ do |count, selector| 
    page.find(:css, selector, :count => count.to_i, match: prefer_exact) 
end 

hoặc nếu bạn có rất nhiều ví dụ như thế này bạn có thể thay đổi cấu hình Capybara cho ngược tương thích, một cái gì đó như thế này

Capybara.configure do |config| 
    config.match = :prefer_exact 
    config.ignore_hidden_elements = false 
end 

Bạn có thể phải sửa đổi điều này để làm cho nó hoạt động nhưng đây là ý tưởng chung. Xem các liên kết tôi đã đề cập ở trên, tất cả trong đó. Hy vọng điều này đặt bạn đi đúng hướng

+0

': prefer_exact' có thể được coi là hành vi xấu như bạn có thể thấy trong bài đăng trên blog mà bạn đã liên kết và được thêm vào trong Capybara 2.1 như nhiều người nói rằng họ cần nó cho tính tương thích ngược với mã được viết cho 1.x . Tôi nghĩ rằng đó là một ý tưởng tồi để tư vấn để sử dụng nó. –

+0

vì vậy tôi đã tham chiếu và liên kết với bài viết mà tôi xứng đáng được bỏ phiếu? Tôi chỉ đơn giản là nói với người hỏi tại sao điều này xảy ra và những gì có thể được thực hiện về nó. Tôi không nói với người hỏi rằng họ không nên cập nhật tính năng này và chỉ làm theo cách này. Chỉ cần chỉ ra rằng câu hỏi là "đã có điều gì đó thay đổi?" – fontno

+0

Thăng hạng vì nó thực sự tập trung sự chú ý của tôi vào sự khác biệt giữa cài đặt 'match'. –

Các vấn đề liên quan