2012-10-18 9 views
5

Używam minitestu z dziewczyną z fabryki i kapibary do testów integracyjnych. Kapibara działa dobrze, kiedy nie fabryka użytkownik dziewczyna stworzyć obiekt użytkownika, jak poniżej:Kapibara nie pracuje z dziewczyną z fabryki

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 

Ale jak tylko próbuję utworzyć użytkownika z dziewczyną fabrycznego dziwne rzeczy zaczynają dzieje, takie jak metoda wizyty a metody click_button przestają działać. Na przykład, nie wydaje się, że nic złego w tym teście:

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 

i oto moja 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 

Oto rzeczywisty błąd, który dostaję:

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

Ale visit login_path działa dobrze jeśli usunąć @user = FactoryGirl.create(:user)

Czy th to błąd w Capybara? Czy robię coś złego tutaj?

+1

co się stanie, jeśli zastąpisz przed blokiem w testowaniu za pomocą let (: user) {Factory (: user)}? – shicholas

+0

To powoduje ten sam błąd. Wygląda na to, że Kapibara po prostu nie przesyła formularza. –

+1

Czy ta linia stanowi problem? 'fill_in" Email ",: with => user.email' Czy nie powinno to być' @ user.email'? –

Odpowiedz

2

I wreszcie to, aby pracować przy użyciu gem DatabaseCleaner korzystając DatabaseCleaner.strategy = truncation. Oto, co skończyło się z:

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 

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

Usuń login_path i spróbuj użyć url

np

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