2012-06-26 9 views
14

Tôi đang sử dụng capybara-webkit để kiểm tra tích hợp với trang web của bên thứ ba (tôi cần javascript).vcr với capybara-webkit

Tôi muốn sử dụng vcr để ghi lại các yêu cầu được thực hiện trong khi kiểm tra tích hợp nhưng capybara-webkit không vượt quá http net để vcr không thể ghi chúng. Làm thế nào tôi sẽ đi về viết một adapter cho vcr mà sẽ cho phép tôi để ghi lại reqeusts?

Trả lời

15

Thật không may, VCR rất không tương thích với capybara-webkit. Thực tế là trang web capybara đang sử dụng webkit, vốn có trong c. Webmock và Fakeweb, là cơ sở cho VCR, chỉ có thể được sử dụng cho các yêu cầu web của Ruby. Làm cho hai công việc với nhau có thể sẽ là một nhiệm vụ hoành tráng.

Tôi đã giải quyết vấn đề này theo hai cách:

đầu tiên (hacky, nhưng hợp lệ) là thêm một tập tin javascript mới đến ứng dụng mà chỉ được bao gồm trong các môi trường thử nghiệm. Tệp này loại bỏ các lớp JS tạo các yêu cầu web bên ngoài. Ngoài hackatude thuần túy của cách tiếp cận này, nó đòi hỏi rằng mỗi khi một yêu cầu mới được thêm vào hoặc thay đổi, bạn phải thay đổi stubs là tốt.

Cách tiếp cận thứ hai là định tuyến tất cả yêu cầu bên ngoài thông qua máy chủ của riêng tôi, ủy quyền hiệu quả tất cả yêu cầu bên ngoài thông qua máy chủ của tôi. Điều này có những bất lợi lớn mà bạn phải có một hành động cho tất cả mọi thứ bạn muốn tiêu thụ (bạn có thể genericize nó, với một số công việc). Nó cũng bị thực tế là nó có thể gấp đôi thời gian cho yêu cầu hoàn thành. Tuy nhiên, kể từ khi các yêu cầu hiện đang được thực hiện bởi Ruby, bạn có thể sử dụng VCR trong tất cả các vinh quang của nó.

Trong trường hợp của tôi, cách tiếp cận # 2 đã được nhiều lợi thế của tôi nhờ vào thực tế là tôi cần ruby ​​để thao tác dữ liệu để tôi có thể giữ nguồn JavaScript bất khả tri của mình. Tuy nhiên, tôi đã sử dụng phương pháp # 1 trong một thời gian khá thành công.

+1

Bạn có thể chạy một máy chủ proxy có mục đích chung khá dễ dàng. Tôi không thể tìm thấy nhiều trong Ruby. Tôi muốn đề nghị [mousehole] (https://github.com/evaryont/mousehole) nếu bạn muốn gắn bó với hệ sinh thái Ruby. –

+0

Phải, bạn có thể. Chúng tôi đã ném điều đó ra vì những phụ thuộc hệ điều hành và cơn ác mộng cấu hình mà chúng tôi đã thấy đến với cách tiếp cận đó. –

+0

bạn gặp phải khó khăn gì khi phân tích dựa trên proxy-server? Chỉ cần thay đổi cài đặt proxy trên hộp chạy capybara-webkit? –

10

Tôi đã viết một thư viện ruby ​​nhỏ (puffing-billy) cho rspec + Capybara thực hiện chính xác này - nó sẽ tiêm nhiễm một proxy ở giữa trình duyệt của bạn và thế giới bên ngoài và cho phép bạn phản ứng giả để yêu cầu cụ thể.

Ví dụ:

describe 'fetching badges from stackoverflow API' do 
    it 'should show a nice message when you have no badges' do 
    # stub some JSONP 
    proxy.stub('http://api.stackoverflow.com/1.1/users/1/badges', 
       :jsonp => { :badges => [] }) 

    visit '/my_badges' 
    page.should have_content("You don't have any badges :(") 
    end 
end 
+0

Ha, vâng, tôi thấy bạn đề cập đến nó trên chủ đề vcr, trông rất intersted. – opsb