【问题标题】:Instance created in db but not showed in page. Test cleaning in Rspec在 db 中创建但未显示在页面中的实例。在 Rspec 中测试清洁
【发布时间】:2014-12-19 14:30:11
【问题描述】:

我正在尝试在规格之间清理我的数据库。所以我决定使用流行的 gem database_cleaner。 现在的问题是,当我使用 FactoryGirl 创建模型的新实例时,它已创建但未显示在页面中。

这是我的 spec_helper:

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'capybara/rails'
require 'capybara/rspec'
require 'factory_girl_rails'
require 'pry'
require 'database_cleaner'

RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.include FactoryGirl::Syntax::Methods

  config.order = :random
  Kernel.srand config.seed

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end
  config.before(:each, type: :feature) { DatabaseCleaner.strategy = :truncation }
  config.before { DatabaseCleaner.start }
  config.after { DatabaseCleaner.clean }
end

我正在尝试运行的简单测试是这个:

require 'spec_helper'

feature 'designs' do
  feature 'editing designs' do
    before(:each) { visit designs_path}
    given!(:design){ create(:design)}

    scenario "from the designs index" do
      binding.pry
      expect(page).to have_content("Ninja Crane")
    end
  end
end

我使用 binding.pry 来检查设计数量并查看页面。结果是设计被正确创建但没有显示在页面中。

提前致谢!

【问题讨论】:

  • 可能您在创建对象之前访问了该页面
  • 我添加了一个睡眠,同样的情况发生了。我认为这不是问题。
  • 这不是睡觉的问题。为什么要解决你的问题?在块before(:each) { visit designs_path} 内放置一个binding.pry 并检查此时designs 表是否包含数据
  • 你完全正确。这解决了我的问题。我只需要更改访问和给予之间的顺序!无论如何,我不明白。我认为它会访问页面,创建对象,然后运行我要求内容的场景。

标签: ruby-on-rails rspec factory-bot database-cleaner


【解决方案1】:

值得注意的是given! 只是let! 的别名,scenario 只是it 的别名。这些是defined by Capybara

在 RSpec 中,let! 使用 before under the hood。每个before 块按定义顺序运行。这意味着,如果您在 let! 块之前定义 before(:each) 块,您就是在告诉 RSpec 在 before(:each) 块之后运行 let! 块。在这种情况下,您是在访问设计路径后创建设计。

it 块之前评估之后的所有before 块。这就是为什么您能够在 binding.pry 语句中看到数据库中的记录。

我建议将您的所有 given! 定义放在顶部,以确保在评估您的任何规范之前定义它们。

我还将测试的练习阶段 (visit design_path) 移动到 scenario 块中,因为使用 before 会使您更难判断您实际测试的内容,并且更有可能运行测试与您预期的顺序不同。

【讨论】:

    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    相关资源
    最近更新 更多