2012-10-18 53 views
5

我正在使用minitest与工厂女孩和水豚进行集成测试。水豚正常工作时我不出厂用户女孩创建一个用户对象,像这样:水豚不与工厂女孩合作

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 

但只要我尝试创建与工厂女孩奇怪的事情开始发生,用户如访问方法和click_button方法停止工作。举例来说,似乎没有要什么不对这个测试:

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 

这是我的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 

下面是我得到实际的错误:

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

但如果我删除@user = FactoryGirl.create(:user)

是日,visit login_path工作正常是水豚的错误?或者我在这里做错了什么?

+1

如果使用let(:user){Factory(:user)}替换测试中的before块,会发生什么情况? – shicholas

+0

得到相同的错误。似乎水豚只是没有提交表格。 –

+1

这行是一个问题吗? 'fill_in“Email”,:with => user.email'它不应该是'@ user.email'吗? –

回答

2

我终于得到这个使用使用DatabaseCleaner.strategy = truncation的DatabaseCleaner宝石工作。这是我结束了:

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 

集成/ 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,并尝试使用url

例如

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