2012-10-18 4 views
5

Sto usando minitest con factory girl e capybara per i test di integrazione. Capybara funziona bene quando non lo faccio fabbrica utente ragazza per creare un oggetto utente, in questo modo:Capybara non funziona con factory girl

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 

Ma non appena provo a creare un utente con la ragazza fabbrica cose strane cominciano ad accadere, come ad esempio il metodo di visita e i metodi click_button smettono di funzionare. Per esempio, non sembra essere qualcosa di sbagliato in questo test:

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 

Ed ecco il mio 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 

Ecco l'errore effettivo che sto ricevendo:

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

Ma, visit login_path funziona bene se tolgo @user = FactoryGirl.create(:user)

Is ° è un bug con Capybara? O sto facendo qualcosa di sbagliato qui?

+1

cosa succede se si sostituisce il blocco precedente nel test con let (: user) {Factory (: user)}? – shicholas

+0

Questo ha lo stesso errore. Sembra che Capybara non stia semplicemente sottomettendo il modulo. –

+1

Questa linea è un problema? 'fill_in" Email ",: con => user.email' Non dovrebbe essere' @ user.email'? –

risposta

2

finalmente ho potuto far funzionare tutto questo utilizzando la gemma DatabaseCleaner utilizzando DatabaseCleaner.strategy = truncation. Ecco quello che ho finito con:

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 

integrazione/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

Rimuovere login_path e tenta di utilizzare url

ad esempio

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