Капибара не работает с фабричной девушкой
Я использую minitest с factory girl и capybara для интеграционных тестов. Capybara прекрасно работает, когда я не использую factory girl для создания объекта пользователя, например:
it "logs in a user successfully" do
visit signup_path
fill_in "Email", :with => "joey@ramones.com"
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 => "joey@ramones.com"
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
Но как только я пытаюсь создать пользователя с factory girl, начинают происходить странные вещи, такие как метод visit и методы 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
А вот и мои фабрики.РБ:
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>
Но, visit login_path
прекрасно работает, если я удаляю @user = FactoryGirl.create(:user)
Это ошибка с капибарой? Или я делаю что-то не так?
2 ответа:
Я, наконец, получил эту работу с помощью DatabaseCleaner камень, используя
DatabaseCleaner.strategy = truncation
. Вот что у меня получилось: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
Фабрики.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