首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rspec/FactoryGirl:干净的数据库状态

Rspec/FactoryGirl:干净的数据库状态
EN

Stack Overflow用户
提问于 2014-01-24 02:22:53
回答 2查看 11.4K关注 0票数 14

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

例如:当我通过工厂女孩创建的数据库中有3条记录时,我希望我的测试能够运行。但是,我目前已经有一个模型记录在数据库中,我不想仅仅为了测试而删除它。把那个1型放在里面会毁了我的测试。

数据库内容

代码语言:javascript
复制
[#<Leaderboard id: 1, score: 500, name: "Trudy">]

leaderboard_spec.rb

代码语言:javascript
复制
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是最高得分率,因为测试运行在一个不正确的状态。

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

EN

回答 2

Stack Overflow用户

发布于 2014-01-24 02:29:13

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

cleaner

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

代码语言:javascript
复制
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

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

票数 40
EN

Stack Overflow用户

发布于 2015-03-03 00:24:40

要尽可能直接地回答回滚问题:不,在测试中没有回滚删除的方法。

按照通常的测试约定,您的目标是从一个干净的板子开始,并使用factory_girl在需要测试的数据库中高效地构建场景。

例如,您可以通过在leaderboards.rb工厂文件中添加一个此文件来实现您想要的结果:

代码语言:javascript
复制
factory :trudy do
  id 1
  score 500
  name "Trudy"
end

或者,您可以在测试文件中创建一个简单的助手函数,在测试需要时重新生成该记录:

代码语言:javascript
复制
def create_trudy
  FactoryGirl.create :leaderboard,
    id: 1,
    score: 500,
    name: "Trudy"
  end
end

或者,您可以将所有这些放在一个描述块中的all (:suite)中,如下所示:

代码语言:javascript
复制
describe "with a leaderboard record existing" do
  before(:each) do
    FactoryGirl.create :leaderboard, id: 1, score: 500, name: "Trudy"
  end
  # Tests with an initial leaderboard record
end
describe "with no leaderboard records initially" do
  # Your test above would go here
end

在最后一个建议中,您的测试变得非常具有描述性,在查看输出时,您将确切地知道数据库在每个测试开始时所处的状态。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21323239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档