Rails:在rspec功能测试期间无法保存在DB上

时间:2014-11-26 23:26:20

标签: ruby-on-rails rspec capybara


我使用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.

我不明白为什么它在我的测试中不起作用。

3 个答案:

答案 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。