gpt4 book ai didi

ruby-on-rails - Rails 5 - 无法清理测试数据库

转载 作者:太空宇宙 更新时间:2023-11-03 16:15:00 25 4
gpt4 key购买 nike

我最近开始使用 RSpec 测试我的应用。作为测试新手,我没有安装人们通常使用的全套工具(即 FactoryGirl,现在也称为 FactoryBot。和 DatabaseCleaner )。

无论如何,这就是发生的事情。在接触了 RSpec 之后,我开始使用 FactoryBot,这样我的测试看起来就不那么复杂了。请注意,:user 是一个 Devise 对象。

# spec/models/first_test_spec.rb

FactoryBot.create(:user)
#Other Code

所以我正在用我的 first_test_spec.rb 做一些事情,然后运行它,一切都运行良好。然后我创建我的第二个规范文件

# spec/models/second_test_spec.rb

FactoryBot.create(:user)
#Other Code

问题来了。我的测试失败了,因为 FactoryBot.create(:user) 无效,因为 Devise 需要唯一的电子邮件。显然,这表明来 self 的 first_test_spec 的数据一直存在,因此出现了错误。

所以我尝试安装 DatabaseCleaner 并希望在每次运行后清除我的测试数据库。我的 rails_helper 看起来像这样:

require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
require 'support/factory_bot'

# Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = false

config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end

config.before(:each) do
DatabaseCleaner.strategy = :transaction
end

config.before(:each, js: true) do
DatabaseCleaner.strategy = :truncation
end

config.before(:each) do
DatabaseCleaner.start
end

config.after(:each) do
DatabaseCleaner.clean
end

config.infer_spec_type_from_file_location!
config.filter_rails_from_backtrace!
end

我认为我已经正确设置了所有内容,所以我不确定是否由于我的 DatabaseCleaner 设置错误而导致错误仍然发生。

无论如何,运行 rspec 仍然会抛出相同的错误,其中 second_test_spec 无法创建 user 对象,因为电子邮件已经存在(验证Devise 自带)。

然后我继续运行以下命令:

rake db:test:prepare
rspec spec/models/second_test_spec.rb

它仍然会抛出相同的错误。所以现在,我不知道我的数据库在运行 rspec 后是否正在清理。但我很确定我一直无法清除我的测试数据库。

所以我想我真的有 2 个问题:

1) 你如何清除你的测试数据库? (谷歌搜索显示 rake db:test:prepare 是方法)

2) 我的 DatabaseCleaner 设置是否正确?如果是这样,它不应该清除数据库吗?

更新:正如评论中向我建议的那样,建议使用 sequence 通过 FactoryBot 创建唯一字段。显然,这使问题消失了,因为不再有来自 Devise 的验证错误。

然后我继续测试了一些东西。

  1. rails c 测试我运行它来检查我的测试数据库,它确实是空的。这表明 DatabaseCleaner 工作正常。我当时不明白的是,为什么需要在 FactoryBot 中对我创建的电子邮件进行排序?或者我想,我不明白 RSpec 是如何“编译和运行”的。

  2. 输入@user.email所以我想打印出电子邮件来查看排序,看看我是否能够破译问题。这是发生了什么:

运行 rspec spec/models/first_test_spec.rb导师电子邮件产生数字 2。

运行 rspec spec/models/second_test_spec.rb导师电子邮件产生数字 3。

运行 rspec导师电子邮件产生数字 2 和 5。

所以我不确定我的测试套件是否存在“问题”。显然我原来的问题已经解决了,这完全是一个单独的话题。但我想如果有人愿意向其他有机会看到这个话题的人解释这个谜团,可能希望这样做。

最佳答案

查看完整的规范文件会有所帮助。如果您按照编写的方式运行规范——在示例组或之前 block 之外创建用户——这将导致记录写入清理策略范围之外,并可能导致数据保留在示例中。否则您的 DBcleaner 配置看起来设置良好。

rake db:test:prepare 是清理测试数据库的正确方法,但除非您有迁移更改,否则不需要经常运行。您可以在测试环境 rails c test 中跳转到一个 Rails 控制台,然后环顾四周,看看是否有任何记录遗留下来。

作为旁注,您可以将 config.use_transactional_fixturesfalse 更改为 true 并从您的应用程序中完全删除 DBcleaner。在走这条路之前,请确保您的数据库中没有残留数据。

关于ruby-on-rails - Rails 5 - 无法清理测试数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47677980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com