2017-05-15 4 views
0

Auf meiner Seite habe ich:Tests UJS Rails mit Capybara, Selen und Rspec

-> eine Form, die den Inhalt einer anderen Website mit einem Ajax-Request mit UJS gemacht kratzt (Fern: true):

<%= simple_form_for @listing, :url => listings_fetch_url, remote: true do |f| %> 
    <%= f.input :url %> 
    <%= f.button :submit, id: 'import_button' %> 
<% end %> 

-> eine andere Form, die von den Schaben ergibt sich aus der Form über

bevölkert wird manuell funktioniert es ...

jedoch w wenn ich versuche, automatisch testen es, tut es nicht. Capybara findet den Submit Button, klickt darauf aber dann hinterlässt es mich auf einer leeren Seite. Hier

ist der Code für den Test:

feature "Listing import" do 
    scenario "fills in the form fields", js: true do 
    visit new_search_path 
    fill_in 'Url', :with => 'www.google.fr' 

    find('input#import_button').click 

    expect(page.body).to have_content 'query was' 
    end 
end 

Die Controller-Aktionen sind die folgenden:

def fetch 
    url = listing_params[:url] 
    @query = Query.new(ScraperService.new({url: url}).perform) 
    render :fill 
end 

# Renders an js.erb file 
def fill 
end 

Es scheint wie rspec mit Selen kann nicht js.erb machen Dateien?

Jede Hilfe wird geschätzt!

EDIT

Dank @ThomasWalpole, befestigte ich einen Fehler 500, die Mechanize verhindert die Bahn zu kratzen. Der Inhalt ist jetzt korrekt gekratzt, aber das Problem bleibt bestehen: Die Seite nach dem Klicken auf den Submit-Button wird leer und die Tests enden nach rechts. In den Protokollen Ich habe eine lange Nachricht:

Could not log "render_template.action_view" event. NoMethodError: undefined method example_group' for nil:NilClass ["/Users/Greg/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/rspec-rails-3.6.0/lib/rspec/rails/view_rendering.rb:67:in current_example_group'"

die das gleiche Problem wie zu sein scheint: 1 & 2

+0

Capybara mit Selen kann definitiv js machen. Erb-Dateien. Schau in deinen Test.Protokolldatei und sehen Sie, welche Anforderungen gestellt werden, welches Format sie anfordern und wie die Antwortcodes lauten. Führt eines von 'Query.new (ScraperService.new ({url: url}). Perform 'eine weitere Anfrage an die App, läuft in separaten Threads usw.? Wenn ja, verwenden Sie: puma als Ihren Capybara-Server (Capybara.server =: puma)? –

+0

Danke für den Tipp @ThomasWalpole! Das Protokoll enthüllte einen Fehler von 500 Servern, der durch 'require' webmock/rspec'' verursacht wurde, was den Zugriff von Mechanize auf das Web verhinderte. 'Query.new ...' macht keine weitere Anfrage an die App und läuft nicht in einem separaten Thread. Die Verwendung von Puma hat leider nichts geändert. Siehe meine aktualisierte Frage. – Greg

+0

Versuchen Sie downgrade zu rspec 3.5.x - könnte ein Fehler sein in 3.6 –

Antwort

1

Gelöst es!

Das Problem kam von der Tatsache, dass meine js.erb nicht ein neues Element auf der aktuellen Seite (d. H. Eine neue Klasse, eine neue ID, ein neues DOM-Element ...).

Capybara wartete nie auf die Ajax-Anfrage zu vervollständigen!

hängten ich eine neue Zeile zu meinem js.erb:

$("#import_button").addClass("imported"); 

Auf diese Weise weiß ich, dass, wenn die importierte Klasse auf der aktuellen Seite ist, bedeutet es die Anforderung Ajax vorbei ist.

Dann in meinem Test habe ich die folgende Zeile:

expect(page).to have_selector :css, '#import_button.imported', wait: 10 

Alles fein jetzt

PS arbeitet: this website hat mir geholfen, das Problem zu verstehen, wie gut

Verwandte Themen