【发布时间】:2015-01-25 10:59:45
【问题描述】:
我正在使用 rspec 执行功能测试,在登录之前我无法将用户保存在数据库中。 我正在使用工厂女孩来构建对象。 夹具在测试开始时保存在db中,但最后没有被删除。(可能是因为测试失败。我不知道)
所以在点击登录之前我无法保存用户并收到此错误消息
-- 弃用警告:为 Devise::Strategies::DatabaseAuthenticatable#validate 提供了一个空资源。请确保资源不为零。 (从 app/controllers/application_controller.rb:43 处的 set_required_vars 调用)
spec/features/login_to_mainpage_spec.rb(没有错误被挽救)
require "rails_helper"
feature 'Navigating to homepage' do
let(:user) { create(:user) }
let(:login_page) { MainLoginPage.new }
scenario "login" do
login_page.visit_page.login(user)
sleep(20)
end
end
一个简单的页面对象:spec/features/pages_objects/main_login_page.rb
class MainLoginPage
include Capybara::DSL
def login(user)
fill_in 'email', with: user.email
fill_in 'password', with: "password"
click_on 'logIn'
end
def visit_page
visit '/'
self
end
end
我的 rails_helper
require 'spec_helper'
require 'capybara/rspec'
require 'capybara/poltergeist'
require "selenium-webdriver"
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
Dir[Rails.root.join("spec/features/page_objects/**/*.rb")].each { |f| require f }
RSpec.configure do |config|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = false
config.before :each do
DatabaseCleaner.start
end
config.after :each do
DatabaseCleaner.clean
end
config.infer_spec_type_from_file_location!
config.include Devise::TestHelpers, :type => :controller
end
Capybara.default_driver = :selenium
Capybara.register_driver :selenium do |app|
Capybara::Selenium::Driver.new(app, :browser => :firefox)
end
在规范助手中:
require 'simplecov'
require 'factory_girl'
require 'rspec/autorun'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
ENV["RAILS_ENV"] ||= 'test'
RSpec.configure do |config|
include ActionDispatch::TestProcess
config.expect_with :rspec do |expectations|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
config.mock_with :rspec do |mocks|
mocks.verify_partial_doubles = true
end
config.disable_monkey_patching!
if config.files_to_run.one?
config.default_formatter = 'doc'
end
config.profile_examples = 10
config.order = :random
Kernel.srand config.seed
end
编辑 1
我将“gem 'factory_girl'”切换为“gem 'factory_girl_rails'”
并将其添加到 application.rb
config.generators do
|g|
g.test_framework :rspec,
:fixtures => true,
:view_specs => false,
:helper_specs => false,
:routing_specs => false,
:controller_specs => true,
:request_specs => true
g.fixture_replacement :factory_girl, :dir => "spec/factories"
end
我仍然无法将用户保存在数据库中。 一切都过去了,但我通过代码输入了一些 sleep(10) 以刷新我的数据库并查看 te 记录,并且永远不会保存用户
编辑 3
我的问题其实很简单。如果我放入 rails_helper,FactoryGirl.create 永远不会将数据保存在数据库中:
config.use_transactional_fixtures = true
或
config.before :each do
DatabaseCleaner.start
end
config.after :each do
DatabaseCleaner.clean
end
/规格/工厂
FactoryGirl.define do
factory :user do
email 'pierre@tralala.com'
password 'password'
password_confirmation 'password'
end
/spec/support/factory_girl.rb
RSpec.configure do |config|
config.include FactoryGirl::Syntax::Methods
end
spec/features/login_to_mainpage_spec.rb
let(:user) { create(:user) }
scenario "login" do
login_page.visit_page.login(create(:user))
sleep(5)
end
由于我之前引用的配置,用户将不会被保存。 我需要在测试之间重置数据。
编辑 4
如果我使用控制台
RAILS_ENV=test rails c
FactoryGirl.create(:user) it is saved in db.
我不明白为什么它在我的测试中不起作用。
【问题讨论】:
标签: ruby-on-rails rspec capybara