2011-01-16 29 views
19

Tôi thực sự thích cách RSpec có thể tách bộ điều khiển và kiểm tra xem nhưng có một số vấn đề với việc ghép nối capybara để làm việc trong thử nghiệm chế độ xem. Những gì tôi về cơ bản cố gắng để đạt được là sth như thế này:Kiểm tra xem Rspec với capybara và rails3

describe "some page" do 
    it "should render with lots of stuff" do 
    assign .. 
    render 
    rendered.should have_button ('Any button') #or any capybara matcher, really 
    end 
end 

Tôi đã nhìn thấy một số bài viết trên mạng cho thấy làm thế nào để cấu hình Capybara và rails3 để làm việc trơn tru với dưa chuột hoặc kiểm tra điều khiển rspec, nhưng điều này là không thực sự những gì Tôi muốn - đó là, kiểm tra các quan điểm ở mức thấp nhất có thể. Ngoài ra nếu có một cách khác để làm điều này (không yêu cầu nhiều mã tùy chỉnh, couse tôi biết tôi có thể viết một số đối sánh trích xuất bộ chọn đã cho từ kết xuất bằng nokogiri hoặc bất kỳ công cụ nào phù hợp) cũng tuyệt vời - sử dụng capybara không phải là một yêu cầu.

Trả lời

1

Ở dưới cùng của trang này, trong "Webrat và Capybara" phần, có vẻ như Capybara là hỗ trợ để xem thông số kỹ thuật rspec

http://relishapp.com/rspec/rspec-rails

+1

Đúng. Nếu bạn sử dụng trình điều khiển mặc định của Capybara (': rack_test'), việc viết các bài kiểm tra xem của bạn là" các kiểm tra yêu cầu "với Capybara vẫn nên cung cấp cho bạn hiệu suất tốt hợp lý, bằng cách này. Đó là cách tôi về cơ bản kiểm tra quan điểm của mình. Bạn chỉ cần không sử dụng 'assign', vì vậy bạn có ít quyền kiểm soát hơn so với các bài kiểm tra xem" thực ". –

11

Capybara hiện không hoạt động với quan điểm thông số kỹ thuật (có kế hoạch để làm cho nó hoạt động trong tương lai). Câu trả lời đơn giản nhất là chỉ cần thêm gem 'webrat' vào Gemfile và bạn đã thiết lập cơ bản. Bạn có thể không có have_button nhưng bạn sẽ có have_selector, have_tag và có sẵn tương tự.

Btw: theo như tôi biết capybara và webrat có thể cùng tồn tại trong một dự án.

+0

Điều này thực sự cần được chấp nhận làm câu trả lời. :-) – sheldonh

+0

Có ai có vấn đề gì với các đối thủ của Capybara bị rò rỉ trong các bài kiểm tra xem không? –

+0

Chỉ cần một lưu ý cho bất cứ ai vấp ngã bởi những ngày này: Capybara không hỗ trợ xem thông số kỹ thuật bây giờ: https://github.com/jnicklas/capybara/blob/master/README.md#using-capybara-with-rspec – tgf

17

Hiện tại có một tùy chọn để sử dụng đối sánh Capybara (không có hành lý Webrat) khi kiểm tra bộ điều khiển (và chế độ xem). Tôi đang sử dụng nó theo cách này:

describe GlobalizeTranslationsController do 

    render_views 
    let(:page) { Capybara::Node::Simple.new(@response.body) } 

    describe "PUT :update" do 
    before do 
     put :update 
    end 

    it "displays a flash notice" do 
     page.should have_selector('p.notice') 
    end 

    end 

end 

Full mã:

Tài liệu tham khảo:

+0

Điều này thật tuyệt vời - câu trả lời chính xác! –

+1

Tôi thực sự không khuyên bạn nên kiểm tra bộ điều khiển như thế. Sử dụng ví dụ của bạn, loại thử nghiệm đó phù hợp hơn ở cấp chế độ xem. –

+0

Hoàn toàn đồng ý! Thông số bộ điều khiển chỉ nên kiểm tra logic bộ điều khiển chứ không chỉ các chế độ xem. Nếu bạn muốn kiểm tra chế độ xem, hãy tạo các đặc tả yêu cầu/tính năng (sử dụng Capybara + Poltergeist hoặc capybara-webkit). –

9

Hơi đơn giản hơn câu trả lời Pawel, nhưng thực chất là như nhau; các công trình sau đây cho tôi với đường ray 3.1.0, 2.6.0 rspec, Capybara 1.1.1:

page = Capybara::Node::Simple.new(rendered) 
page.should have_content("blah") 
3

Bạn không thể gọi phương pháp Capybara về rendered, đó chỉ là một chuỗi. Bạn có thể sử dụng Capybara's string method mặc dù để bọc rendered trong nút Capybara.Sau đó, bạn có thể gọi các phương thức Capybara về nút đó:

describe "some page" do 
    it "should render with lots of stuff" do 
    assign .. 
    render 
    Capybara.string(rendered).should have_button('Any button') 
    end 
end 

Để biết thêm thông tin, hãy kiểm tra bài đăng này:

http://www.tamingthemindmonkey.com/2011/11/07/capybara-matchers-and-scoping-in-view-specs

0

Bạn cũng có thể sử dụng Capybara cú pháp

describe "some page" do 
    it 'should render hello with name' do 
    assign(:user, double("User", first_name: "John")) 
    render 
    expect(rendered).to have_content("Hello John") 
    end 
end 
1

Đang cập nhật câu hỏi cũ này vì mọi thứ đã thay đổi vì hầu hết các câu trả lời khác đã được thêm vào:

Giờ đây Capybara hỗ trợ thông số kỹ thuật xem (ngoài hộp) và điều này được ghi lại trên Capybara's master branch.

Để trích dẫn tài liệu:

Cuối cùng, Capybara quẹt được hỗ trợ theo quan điểm thông số kỹ thuật:

RSpec.describe "todos/show.html.erb", type: :view do 
    it "displays the todo title" do 
    assign :todo, Todo.new(title: "Buy milk") 

    render 

    expect(rendered).to have_css("header h1", text: "Buy milk") 
    end 
end 

Hỗ trợ cho những không cần thông qua let(:page) mã phong cách dường như đã được thêm vào trong phiên bản trước đây. (Nó làm việc cho tôi trong capybara 2.4.4 và 2.2).
Cũng lưu ý rằng chỉ có một tập con đối sánh giới hạn được hỗ trợ; tuy nhiên bạn có thể đạt được nhiều chức năng hơn bằng cách sử dụng Capybara.string; ví dụ:

expect(Capybara.string(rendered).first('td')).to have_no_content 'Tom Riddle' 
Các vấn đề liên quan