ruby-on-rails - Rspec/FactoryGirl : clean database state

标签 ruby-on-rails ruby-on-rails-3 rspec factory-bot

我是 Rspec 和 Factory girl 的新手,希望我的测试在特定的数据库状态下运行。我知道我可以让工厂女孩创建这些记录,并且测试运行后对象将被销毁,但是如果我在数据库中有数据会发生什么。

例如:我希望我的测试在我通过 Factory Girl 创建的数据库中有 3 条记录时运行。但是,我目前在数据库中已经有 1 个模型记录,我不想为了测试而删除它。有那个 1 模型在那里破坏了我的测试。

数据库内容

[#<Leaderboard id: 1, score: 500, name: "Trudy">]

leaderboard_spec.rb
require 'spec_helper'

describe Rom::Leaderboard do

    describe "poll leaderboard" do
        it "should say 'Successful Run' when it returns" do
            FactoryGirl.create(:leaderboard, score: 400, name: "Alice")
            FactoryGirl.create(:leaderboard, score: 300, name: "Bob")
            FactoryGirl.create(:leaderboard, score: 200, name: "John")
            Leaderboard.highest_scorer.name.should == "Alice"
        end
    end

end

现在我的测试将失败,因为它会错误地假设 Trudy 是得分最高的人,因为测试在不正确的状态下运行。

工厂女孩是否提供从数据库中删除记录然后回滚此删除?类似于它如何在数据库中创建记录并回滚

最佳答案

它流行使用 database_cleaner gem 。你可以在这里找到它:

https://github.com/bmabey/database_cleaner

该文档建议对 rspec 进行以下配置:

RSpec.configure do |config|

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

end

这将确保每个测试都有一个干净的数据库。

关于ruby-on-rails - Rspec/FactoryGirl : clean database state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21323239/

相关文章:

ruby-on-rails - 将图像上传到云服务的最简单解决方案

javascript - Rails 3 Ajax 表单不发送参数

ruby-on-rails - spring rspec连接不上数据库

ruby-on-rails - 无法运行 rspec(未定义方法 `belongs_to' )

sql - rails/SQL : count the number of consecutive records having a specific status

ruby-on-rails - 过滤能够使用 Devise 登录的用户

ruby-on-rails - 如何使用acts_as_taggable_on 缓存标签?

ruby - Rails 3 - 我可以将开始日期设置为 date_select 方法吗?

ruby-on-rails - Rails 列迁移中的 `index` 选项是否有效?

ruby-on-rails - 您期望如何使用 Rspec 中的 .deliver 调用邮件程序函数?