RubyOnRails4:测试和数据库之间的奇怪交互

时间:2013-11-20 10:57:56

标签: ruby-on-rails rspec ruby-on-rails-4 tdd factory-bot

与标题中的建议一样,我有一个奇怪的错误。事实上,当我尝试为测试环境保留一个操作时(例如: rake test:prepare ),它会以某种方式影响其他环境并删除我数据库中的所有记录(mysql) 。 (我正在使用rspec,我正在关注Michael Hartl的教程。) 另一个例子(可能更清楚)是当我编写测试时,通过FactoryGirl来暗示创建和取消新用户:

位置:spec / factories.rb

FactoryGirl.define do

  factory :user do

  sequence(:name)          {|n| "Person #{n}"}
  sequence(:email)         {|n| "person_#{n}@example.it"}
  password                 "luckyluke"
  password_confirmation    "luckyluke"

  factory :admin do
    admin true
  end
end

位置:spec / requests / users_pages_spec.rb

describe "pagination" do

  before(:all) { 30.times { FactoryGirl.create(:user) } }
  after(:all)  { User.delete_all }

  # tests...
end

虽然我进入了测试环境,但是当我跑步时 捆绑exec rspec spec / requests / users_pages_spec.rb ,rails确实在我的数据库上创建了30个用户,并且确实从数据库中删除了所有用户。 (也是在测试之前创建和存储的用户!!)。

P.S。对不起我的英文

1 个答案:

答案 0 :(得分:0)

模拟数据库应该在每次测试之前进行,以确保隔离。这样,FactoryGirl还负责删除其创建的所有内容(如此answer中所述):

describe "pagination" do

  before(:each) { 30.times { FactoryGirl.create(:user) } }

  # tests...
end

另外,建议数据库在测试之前不包含来自的任何数据,因为它可能会改变测试的行为 - 它应该只包含 测试期望它包含。