我找到了一篇关于 Testing Factories First 的博文(通过 BigBinary - 这恰好是 Thoughtbot's RSpec original 的 Minitest/spec 版本)。
你能给我展示一下没有 spec
框架的等价物——只有 Minitest (Rails) 吗?
Thoughtbot 方法 (RSpec)
spec/factories_spec.rb
FactoryGirl.factories.map(&:name).each do |factory_name|
describe "The #{factory_name} factory" do
it 'is valid' do
build(factory_name).should be_valid
end
end
end
拉克文件
if defined?(RSpec)
desc 'Run factory specs.'
RSpec::Core::RakeTask.new(:factory_specs) do |t|
t.pattern = './spec/factories_spec.rb'
end
end
task spec: :factory_specs
BigBinary 方法(Minitest,规范)
spec/factories_spec.rb
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
describe FactoryGirl do
EXCEPTIONS = %w(base_address base_batch bad_shipping_address)
FactoryGirl.factories.each do |factory|
next if EXCEPTIONS.include?(factory.name.to_s)
describe "The #{factory.name} factory" do
it 'is valid' do
instance = build(factory.name)
instance.must_be :valid?
end
end
end
end
lib/tasks/factory.rake
desc 'Run factory specs.'
Rake::TestTask.new(:factory_specs) do |t|
t.pattern = './spec/factories_spec.rb'
end
task test: :factory_specs
什么是 Minitest 等效项(没有 spec
)?
最佳答案
我在下面介绍的方法与两个原始解决方案略有不同 - 从某种意义上说,我的方法只创建一个测试,我在其中循环遍历工厂并对每个工厂运行断言。我无法创建更接近于模仿原始解决方案的解决方案 - 这是(我相信)每个工厂的单独测试方法。如果有人可以展示这样的实现,那就太好了。
测试/aaa_factories_tests/factories_test.rb
require File.expand_path(File.dirname(__FILE__) + '/../test_helper.rb')
class FactoriesTest < Minitest::Unit::TestCase
puts "\n*** Factories Test ***\n\n"
EXCEPTIONS = %w(name_of_a_factory_to_skip another_one_to_skip)
def test_factories
FactoryGirl.factories.each do |factory|
next if EXCEPTIONS.include?(factory.name.to_s)
instance = FactoryGirl.build(factory.name)
assert instance.valid?, "invalid factory: #{factory.name}, error messages: #{instance.errors.messages.inspect}"
instance = factory = nil
end
end
end
感谢一路Minitest
works out of the box -- 在 test/
下添加任何目录和 minitest-rails
将自动为其创建关联的 rake 任务。所以假设你添加了一个 test/api/
目录,rake minitest:api
将自动可用。 -- 我在运行 bundle exec rake -T
时看到任务没有其他配置:
rake minitest:aaa_factories_tests # Runs tests under test/aaa_factories_tests
而且我能够成功运行此任务:
-bash> bundle exec rake minitest:aaa_factories_tests
*** Factories Test ***
Run options: --seed 19208
# Running tests:
.
Finished tests in 0.312244s, 3.2026 tests/s, 9.6079 assertions/s.
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
尽管在目录前加上 aaa
很丑陋,我可以先对工厂进行测试:
bundle exec rake minitest:all
aaa prepend 解决方案的原因是 MiniTest
does a Dir
glob
和 Mac OS X
(和其他 Unix 变体)结果按字母顺序排序 ( though the results differ across different platforms )。
同时,我在 the default_tasks
array 前面加上了前缀与 aaa_factories_tests
让工厂首先在默认Minitest
中进行测试任务(即运行 bundle exec rake minitest
时)。
lib/tasks/factories_first.rake
MiniTest::Rails::Testing.default_tasks.unshift('aaa_factories_tests') if Rails.env =~ /^(development|test)\z/
请注意,上述条件避免了错误引用 Minitest
在它不可用的环境中(我将 minitest-rails
限制为 :test
和 :development
组在 Gemfile
中)。没有这个 if
-条件,推送到 Heroku(例如 staging
或 production
)将导致 uninitialized constant MiniTest
.
当然我也可以直接跑工厂测试:
bundle exec ruby -I test test/aaa_factories_tests/factories_test.rb
关于ruby-on-rails - 如何在没有规范框架的情况下使用 Minitest 首先测试工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19985696/