我使用rspec执行功能测试,我无法在登录前将用户保存在数据库中。 我使用工厂女孩来构建对象。 fixture在测试开始时保存在db中,但最后没有删除。(可能因为测试失败。我不知道)
所以我无法在点击logIn之前保存用户,我收到此错误信息
- 弃用警告:给Devise :: Strategies :: DatabaseAuthenticatable#validate一个空的资源。请确保资源不是零。 (从app / controllers / application_controller.rb中的set_required_vars调用:43)
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'" to" 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
我仍然无法将用户保存在DB中。 一切都通过,但我通过代码放入一些睡眠(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
规格/特征/ 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.
我不明白为什么它在我的测试中不起作用。
答案 0 :(得分:1)
尝试使用let!
创建您的用户。
来自rSpec documentation:
请注意,let是惰性计算的:直到第一次才会计算它 调用它定义的方法。你可以用let!强制方法的 在每个例子之前调用。
答案 1 :(得分:0)
你说你正在使用FactoryGirl,但我没有在你的测试中看到这一点。要使用FactoryGirl创建我的用户,我总是这样做:
FactoryGirl.create(:user, password: 'test', password_confirmation: 'test', name: 'test')
如果在您的工厂中正确设置,您只需写:
FactoryGirl.create(:user)
答案 2 :(得分:0)
使用独特字段解决您的问题FactoryGirl为您提供序列:
sequence :email do |n|
"person#{n}@example.com"
end
factory :user do
email { generate(:email }
end
这将从" person1@example.com"开始;每次调用FactoryGirl.create(:user)时,将数字加1。