我是新的Rspec和工厂女孩,我希望我的测试运行在一个特定的数据库状态。我知道我可以让工厂女孩创建这些记录,在测试运行之后,这些对象将被销毁,但是如果我有数据库中的数据,会发生什么呢?
例如:当我通过工厂女孩创建的数据库中有3条记录时,我希望我的测试能够运行。但是,我目前已经有一个模型记录在数据库中,我不想仅仅为了测试而删除它。把那个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是最高得分率,因为测试运行在一个不正确的状态。
工厂女孩是否提供删除数据库中的记录,然后回滚此删除?类似于它如何在数据库中创建记录和回滚。
发布于 2014-01-24 02:29:13
它的流行使用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这将确保每个测试都有一个干净的数据库。
发布于 2015-03-03 00:24:40
要尽可能直接地回答回滚问题:不,在测试中没有回滚删除的方法。
按照通常的测试约定,您的目标是从一个干净的板子开始,并使用factory_girl在需要测试的数据库中高效地构建场景。
例如,您可以通过在leaderboards.rb工厂文件中添加一个此文件来实现您想要的结果:
factory :trudy do
id 1
score 500
name "Trudy"
end或者,您可以在测试文件中创建一个简单的助手函数,在测试需要时重新生成该记录:
def create_trudy
FactoryGirl.create :leaderboard,
id: 1,
score: 500,
name: "Trudy"
end
end或者,您可以将所有这些放在一个描述块中的all (:suite)中,如下所示:
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在最后一个建议中,您的测试变得非常具有描述性,在查看输出时,您将确切地知道数据库在每个测试开始时所处的状态。
https://stackoverflow.com/questions/21323239
复制相似问题