use*_*382 14 rspec ruby-on-rails ruby-on-rails-3 factory-bot
我是Rspec和Factory女孩的新手,希望我的测试能够在特定的数据库状态下运行.我知道我可以让Factory girl创建这些记录,并且在测试运行后对象将被销毁,但是如果我在数据库中有数据会发生什么.
例如:我希望我的测试在我通过Factory Girl创建的数据库中有3条记录时运行.但是,我目前在数据库中已有1个模型记录,我不想仅为测试删除它.那里有一个模型毁了我的测试.
数据库内容
[#<Leaderboard id: 1, score: 500, name: "Trudy">]
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
现在我的测试将失败,因为它会错误地认为Trudy是最高得分手,因为测试运行的状态不正确.
工厂女孩是否提供从数据库中删除记录然后回滚此删除?类似于它在数据库中创建记录和回滚的方式
jkl*_*ina 38
它的流行使用database_cleaner
宝石.你可以在这里找到它:
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
Run Code Online (Sandbox Code Playgroud)
这将确保每个测试都有一个干净的数据库.