eve*_*992 5 testing ruby-on-rails minitest factory-bot
rails代码库中有注释表明应该在运行之间重置测试数据库
耙-T
rake test:all # Run tests quickly by merging all types and not resetting db
rake test:all:db # Run tests quickly, but also reset db
Run Code Online (Sandbox Code Playgroud)
配置/ database.yml的
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
Run Code Online (Sandbox Code Playgroud)
对我来说,情况似乎并非如此.
我正在使用工厂女孩生成测试模型,这里是一个示例工厂
FactoryGirl.define do
factory :podcast do
sequence(:title) { |n| "Podcast #{n}" }
sequence(:feed_url) { |n| "http://podcast.com/#{n}" }
end
end
Run Code Online (Sandbox Code Playgroud)
播客应该有一个独特的feed_url,所以我验证它在模型中的唯一性.
class Podcast < ActiveRecord::Base
validates :feed_url, uniqueness: true, presence: true
end
Run Code Online (Sandbox Code Playgroud)
在test_helper.rb我lint所有工厂
ENV["RAILS_ENV"] ||= "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'minitest/autorun'
FactoryGirl.lint
Run Code Online (Sandbox Code Playgroud)
我的测试创建一个播客,使用相同的名称构建另一个播客,然后断言第二个是无效的.
require 'test_helper'
describe Podcast do
describe '#feed_url' do
it 'must be unique' do
podcast = create(:podcast)
new_podcast = build(:podcast, feed_url: podcast.name)
assert_invalid podcast, :feed_url, 'has already been taken'
end
end
end
Run Code Online (Sandbox Code Playgroud)
我第一次运行测试时执行没有错误,测试全部通过.第二次运行测试时,Factory Girl lint失败,因为podcast feed_url已经被执行了.
为什么不在运行之间重建测试数据库?
数据库未重置的原因是您在rails提供的数据库事务之外运行测试.本ActiveSupport::TestCase类是所有轨道测试的基础.ActiveRecord将此测试数据库事务添加到此类.此事务将在每次测试后重置数据库.但是,您没有运行测试ActiveSupport::TestCase,您正在运行Minitest::Spec未配置为运行事务的测试.
最简单的解决方案是在您的Gemfile中添加minitest-rails,并将test_helper.rb文件中的require更改minitest/autorun为minitest/rails.如果您希望添加自己对Minitest规范DSL的支持,可以使用本文作为起点.
我们有一个更复杂的FactoryGirl设置,用一些规范项目准备我们的数据库,但我想你可能可以直接将这些代码放在你test_helper.rb的数据库中以确保数据库被清空:
# Destroy all models because they do not get destroyed automatically
(ActiveRecord::Base.connection.tables - %w{schema_migrations}).each do |table_name|
ActiveRecord::Base.connection.execute "TRUNCATE TABLE #{table_name};"
end
Run Code Online (Sandbox Code Playgroud)
或者,rake db:test:prepare在每次运行之前运行.
您也可以使用宝石,但我没有任何使用经验:http://rubygems.org/gems/database_cleaner.
| 归档时间: |
|
| 查看次数: |
7034 次 |
| 最近记录: |