2012-06-26 9 views
14

Ich benutze Capybara-Webkit, um die Integration mit einer Drittanbieter-Website zu testen (Ich brauche Javascript).vcr mit capybara-webkit

Ich möchte vcr verwenden, um während des Integrationstests vorgenommene Anforderungen aufzuzeichnen, aber capybara-webkit geht nicht über http hinaus, so dass vcr sie nicht aufzeichnen kann. Wie würde ich einen Adapter für vcr schreiben, mit dem ich die Anforderungen aufzeichnen könnte?

Antwort

15

Leider ist VCR mit Capybara-webkit sehr inkompatibel. Tatsache ist, dass Capybara Webkit Webkit verwendet, das in c ist. Webmock und Fakeweb, die die Basis für VCR sind, können nur für Ruby Web-Anfragen verwendet werden. Es wäre wahrscheinlich eine monumentale Aufgabe, die beiden zusammenzuarbeiten.

Ich habe dieses Problem auf zwei Arten gelöst:

Die erste (hacky, aber gültig) ist eine neue JavaScript-Datei der Anwendung hinzuzufügen, die nur in der Testumgebung enthalten ist. Diese Datei stuffed die JS-Klassen, die externe Webanfragen stellen. Abgesehen von der reinen Hackatude dieses Ansatzes erfordert es, dass jedes Mal, wenn eine neue Anfrage hinzugefügt oder geändert wird, auch die Stubs geändert werden müssen.

Der zweite Ansatz besteht darin, alle externen Anforderungen über meinen eigenen Server zu leiten und alle externen Anforderungen über meinen Server zu verwalten. Dies hat den großen Nachteil, dass Sie eine Aktion für alles haben müssen, was Sie konsumieren möchten (Sie könnten es mit etwas Arbeit generisch machen). Es leidet auch unter der Tatsache, dass es doppelt so viel Zeit für die Anforderung zu vervollständigen. Da die Anfragen jetzt von Ruby gestellt werden, können Sie VCR in all seiner Pracht verwenden.

In meinen Situationen, Ansatz Nr. 2 ist viel mehr zu meinem Vorteil, dank der Tatsache, dass ich Ruby, um die Daten zu manipulieren, so dass ich mein Javascript Quell-Agnostiker halten kann. Ich habe jedoch den Ansatz Nr. 1 für eine ganze Weile erfolgreich verwendet.

+1

Sie können ziemlich leicht einen Universal Proxy-Server ausgeführt werden. Ich konnte in Ruby nicht viele finden. Ich würde vorschlagen [Mousehole] (https://github.com/evaryont/mousehole), wenn Sie im Ruby-Ökosystem bleiben möchten. –

+0

Richtig, du kannst. Wir haben das wegen der Betriebssystemabhängigkeiten und des Konfigurations-Albtraums, die wir mit diesem Ansatz gesehen haben, rausgeworfen. –

+0

Welche Schwierigkeiten gab es bei der Proxy-Server-basierten Analyse? Sie müssen nur die Proxy-Einstellungen auf der Box, auf der capybara-webkit läuft, ändern? –

10

Ich habe eine kleine Ruby-Bibliothek (puffing-billy) für rspec + Capybara geschrieben, die genau das tut - es fügt einen Proxy zwischen Ihrem Browser und der Außenwelt und ermöglicht es Ihnen, Antworten auf bestimmte Anfragen zu fälschen.

Beispiel:

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, yeah, ich habe gesehen, dass du es auf dem VCR-Thread erwähnt hast, sieht sehr interessant aus. – opsb