【问题标题】:RubyOnRails4: Strange interaction between tests and databaseRubyOnRails4:测试和数据库之间奇怪的交互
【发布时间】:2013-12-04 07:58:25
【问题描述】:

就像标题中建议的那样,我有一个奇怪的错误。事实上,当我尝试为测试环境保留一个操作(例如: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

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

附:对不起我的英语

【问题讨论】:

  • 检查您的config/database.yml 文件以确保您的测试数据库与您的开发数据库不同。

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


【解决方案1】:

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

describe "pagination" do

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

  # tests...
end

此外,建议数据库不要包含测试之前的任何数据,因为它可能会改变测试的行为 - 它应该包含 什么测试期望它包含。

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 2015-07-30
    • 2016-12-13
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2019-12-26
    相关资源
    最近更新 更多