ruby-on-rails - 如何在没有规范框架的情况下使用 Minitest 首先测试工厂?

标签 ruby-on-rails testing factory-bot minitest

我找到了一篇关于 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(例如 stagingproduction )将导致 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/

相关文章:

python - Django APIClient 发布为空

ruby-on-rails - FactoryGirl after_create 方法不保存

mysql gem 与 mysql2 gem 和 'each_hash' 方法

ruby-on-rails - 通过rails 3中的查询字符串路由?

regex - 去测试正则表达式类型或语法

testing - alexa技能会指出要将商品发送到的配置文件名称,城市和密码,这会通过认证吗?

ruby-on-rails - 使用 FactoryGirl 进行 Controller 测试

ruby-on-rails - RSpec 3 : Simple validates_uniqueness_of Failure

ruby-on-rails - 任何人都知道为什么我会收到此 RSpec 错误?得到零 <--

ruby-on-rails - 为什么我无法在 Ruby On Rails 上安装 mysql2?