我最近开始使用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
需要唯一的电子邮件。很明显,这表明来自myfirst_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
对象,因为电子邮件已经存在(一个带有设计本身的验证)。然后我继续运行以下命令:
rake db:test:prepare
rspec spec/models/second_test_spec.rb
它仍然会抛出同样的错误。所以现在,我不知道在运行rspec之后我的数据库是否正在被清理。但我很确定我无法清除我的测试数据库。
所以我想我真的有两个问题:
1)如何清除测试数据库?(google显示
rake db:test:prepare
是一种方式)2)我的
DatabaseCleaner
设置是否正确如果是的话,难道它不应该清除数据库吗?更新:
正如我在评论中建议的那样,建议使用
sequence
创建带有factorybot的唯一字段。很明显,这使得问题消失了,因为不再有来自devise的验证错误。然后我继续测试了一些东西。
rails c test
我运行这个来检查我的测试数据库,它确实是空的这表明DatabaseCleaner工作得非常好我无法理解的是,为什么需要在FactoryBot中排列我的电子邮件创建顺序?或者我想,我不明白RSpec是如何“编译和运行”的。
puts @user.email
所以我想把邮件打印出来,看看序列,看看我是否能破解这个问题。下面是发生的事情:
运行
rspec spec/models/first_test_spec.rb
家庭教师电子邮件产生数字2。
运行
rspec spec/models/second_test_spec.rb
家庭教师电子邮件生成数字3。
运行
rspec
家庭教师的电子邮件产生数字2和5。
所以我不确定我的测试套件是否有“问题”很明显,我原来的问题已经解决了,这是一个单独的话题但我想如果有人想向其他任何人解释这个谜谁有机会在这个线程可能希望这样做。
最佳答案
查看完整的规范文件会有帮助。如果您正在按您编写的方式运行规范(在示例组或before块之外创建用户),这将导致记录被写入清理策略范围之外,并可能导致数据保留在示例之间。否则,dbcleaner配置看起来设置得很好。rake db:test:prepare
是清理测试数据库的正确方法,但不需要经常运行,除非您有迁移更改您可以跳入测试环境rails c test
中的rails控制台,四处查看是否有任何记录遗留下来。
另外,您可以将config.use_transactional_fixtures
从false
翻转到true
并从应用程序中完全删除DBcleaner在走这条路之前,请确保数据库中没有任何剩余数据。