2012-10-18 4 views
5

Ich benutze Minitest mit Fabrik Mädchen und Capybara für Integrationstests. Capybara funktioniert gut, wenn ich nicht vom Benutzer Fabrik Mädchen tut ein Benutzerobjekt, wie diese zu erstellen:Capybara arbeitet nicht mit Fabrik Mädchen

it "logs in a user successfully" do 
    visit signup_path 
    fill_in "Email", :with => "[email protected]" 
    fill_in "Password", :with => "rockawaybeach" 
    fill_in "Password confirmation", :with => "rockawaybeach" 
    click_button "Create User" 
    current_path == "/" 
    page.text.must_include "Signed up!" 
    visit login_path 
    fill_in "Email", :with => "[email protected]" 
    fill_in "Password", :with => "rockawaybeach" 
    check "Remember me" 
    click_button "Log in" 
    current_path == "/dashboard" 
    page.text.must_include "Logged in!" 
    page.text.must_include "Your Dashboard" 
    end 

Aber sobald ich versuche, einen Benutzer mit Fabrik Mädchen seltsame Dinge passiert starten, wie der Besuch Methode zu erstellen und click_button-Methoden funktionieren nicht mehr. Zum Beispiel, es scheint nicht zu etwas falsch mit diesem Test zu sein:

require "test_helper" 

describe "Password resets" do 
    before(:each) do 
    @user = FactoryGirl.create(:user) 
    end 

    it "emails user when requesting password reset" do 
    visit login_path 
    click_link "password" 
    fill_in "Email", :with => user.email 
    click_button "Reset my password" 
    end 

end 

Und hier ist mein factories.rb:

FactoryGirl.define do 
    factory :user do |f| 
    f.sequence(:email) { |n| "foo#{n}@example.com" } 
    f.password "secret" 
    f.password_confirmation "secret" 
    end 
end 

Hier ist der tatsächliche Fehler, die ich erhalte:

est_0001_emails user when requesting password reset  0:00:01.624 ERROR 
     undefined local variable or method `login_path' for #<#<Class:0x007fc2db48d820>:0x007fc2df337e40> 

Aber visit login_path funktioniert gut, wenn ich entfernen @user = FactoryGirl.create(:user)

Ist th ist ein Fehler mit Capybara? Oder mache ich hier etwas falsch?

+1

Was passiert, wenn Sie den Vorher-Block in Ihrem Test durch let (: user) {Factory (: user)} ersetzen? – shicholas

+0

Das wird der gleiche Fehler. Es scheint, dass Capybara das Formular einfach nicht einreicht. –

+1

Ist diese Linie ein Problem? 'fill_in" Email ",: mit => user.email' Sollte es nicht' @ user.email' sein? –

Antwort

2

ich diese endlich mit DatabaseCleaner.strategy = truncation mit der DatabaseCleaner gem zu arbeiten. Hier ist, was ich am Ende mit:

test_helper.rb

ENV["RAILS_ENV"] = "test" 
require File.expand_path("../../config/environment", __FILE__) 
require "minitest/autorun" 
require "capybara/rails" 
require "active_support/testing/setup_and_teardown" 

class IntegrationTest < MiniTest::Spec 
    include Rails.application.routes.url_helpers 
    include Capybara::DSL 
    register_spec_type(/integration$/, self) 

    def last_email 
    ActionMailer::Base.deliveries.last 
    end 

    def reset_email 
    ActionMailer::Base.deliveries = [] 
    end 
end 

class HelperTest < MiniTest::Spec 
    include ActiveSupport::Testing::SetupAndTeardown 
    include ActionView::TestCase::Behavior 
    register_spec_type(/Helper$/, self) 
end 

Turn.config.format = :outline 

# Database cleaner. 
DatabaseCleaner.strategy = :truncation 

factories.rb

FactoryGirl.define do 
    sequence :email do |n| 
    "email#{n}@example.com" 
    end 

    factory :user do 
    email 
    password "secret" 
    password_confirmation "secret" 
    end 
end 

Integration/login_integration_test.rb

require "test_helper" 

describe "Login integration" do  
    it "shouldn't allow an invalid login" do 
    visit login_path 
    click_button "Log In" 
    page.text.must_include "invalid" 
    end 

    it "should login a valid user" do 
    DatabaseCleaner.clean 
    user = FactoryGirl.create(:user) 
    visit login_path 
    within ".session" do 
     fill_in "session_email", :with => user.email 
     fill_in "session_password", :with => "secret" 
    end 
    click_button "Log In" 
    page.text.must_include "Logged in!" 
    save_and_open_page 
    end 
end 
-1

login_path entfernen und versuchen url

zum Beispiel verwenden

visit "https://stackoverflow.com/users/login" #login_path 
Verwandte Themen