2012-10-18 9 views
5

Tôi đang sử dụng minitest với cô gái nhà máy và capybara để kiểm tra tích hợp. Capybara hoạt động tốt khi tôi không sử dụng máy cô gái để tạo ra một đối tượng người dùng, như thế này:Capybara không hoạt động với nhà máy nữ

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 

Nhưng ngay sau khi tôi cố gắng tạo ra một người dùng với máy cô gái những điều kỳ lạ bắt đầu xảy ra, chẳng hạn như các phương pháp truy cập và các phương thức click_button ngừng hoạt động. Ví dụ, có dường như không có bất cứ điều gì sai trái với thử nghiệm này:

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 

Và đây là factories.rb tôi:

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

Đây là lỗi thực tế mà tôi nhận được:

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

Nhưng, visit login_path hoạt động tốt nếu tôi loại bỏ @user = FactoryGirl.create(:user)

là thứ là một lỗi với Capybara? Hay tôi đang làm gì sai ở đây?

+1

điều gì sẽ xảy ra nếu bạn thay thế khối trước đó trong thử nghiệm của bạn bằng let (: user) {Factory (: user)}? – shicholas

+0

Điều đó có cùng lỗi. Có vẻ như Capybara chỉ không gửi biểu mẫu. –

+1

Dòng này có phải là sự cố không? 'fill_in" Email ",: with => user.email' Không phải là' @ user.email'? –

Trả lời

2

cuối cùng tôi nhận được để làm việc này bằng cách sử dụng đá quý DatabaseCleaner sử dụng DatabaseCleaner.strategy = truncation. Đây là những gì tôi đã kết thúc với:

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 

hội nhập/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

Di login_path và cố gắng sử dụng url

ví dụ

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