Ruby on rails 如何首先使用Minitest测试工厂,但不使用spec框架?

Ruby on rails 如何首先使用Minitest测试工厂,但不使用spec框架?,ruby-on-rails,testing,factory-bot,minitest,Ruby On Rails,Testing,Factory Bot,Minitest,我发现了一篇关于(BigBinary的)的博客文章,它恰好是的Minitest/spec版本 你能给我看一下没有specframework的等效框架吗?只需使用Minitest(Rails) 思维方式(RSpec) 规范/工厂\u规范rb FactoryGirl.factories.map(&:name).each do |factory_name| describe "The #{factory_name} factory" do it 'is valid' do

我发现了一篇关于(BigBinary的)的博客文章,它恰好是的Minitest/spec版本

你能给我看一下没有
spec
framework的等效框架吗?只需使用Minitest(Rails)

思维方式(RSpec) 规范/工厂\u规范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
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
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
require File.expand_path(File.dirname(__FILE__) + '/test_helper')

class FactoriesTest < ActiveSupport::TestCase
  EXCEPTIONS = %w(griddler_email)
  FactoryBot.factories.map(&:name).each do |factory_name|
    next if factory_name.to_s.in?(EXCEPTIONS)
    context "The  #{factory_name} factory" do
      should 'be valid' do
        factory = build(factory_name)
        assert_equal true, factory.valid?, factory.errors.full_messages
      end
    end
  end
end
Rakefile

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
desc 'Run factory specs.'
Rake::TestTask.new(:factory_specs) do |t|
  t.pattern = './spec/factories_spec.rb'
end

task test: :factory_specs
MiniTest::Rails::Testing.default_tasks.unshift('aaa_factories_tests') if Rails.env =~ /^(development|test)\z/
namespace :test do
  desc 'Test factories'
  Rake::TestTask.new(:factories) do |t|
    t.pattern = './test/factories_test.rb'
  end
end

task minitest: 'test:factories'
BigBinary方法(Minitest,spec) 规范/工厂\u规范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
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
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
require File.expand_path(File.dirname(__FILE__) + '/test_helper')

class FactoriesTest < ActiveSupport::TestCase
  EXCEPTIONS = %w(griddler_email)
  FactoryBot.factories.map(&:name).each do |factory_name|
    next if factory_name.to_s.in?(EXCEPTIONS)
    context "The  #{factory_name} factory" do
      should 'be valid' do
        factory = build(factory_name)
        assert_equal true, factory.valid?, factory.errors.full_messages
      end
    end
  end
end
lib/tasks/factory.rake

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
desc 'Run factory specs.'
Rake::TestTask.new(:factory_specs) do |t|
  t.pattern = './spec/factories_spec.rb'
end

task test: :factory_specs
MiniTest::Rails::Testing.default_tasks.unshift('aaa_factories_tests') if Rails.env =~ /^(development|test)\z/
namespace :test do
  desc 'Test factories'
  Rake::TestTask.new(:factories) do |t|
    t.pattern = './test/factories_test.rb'
  end
end

task minitest: 'test:factories'

小型测试的等价物是什么(没有
spec
)?

我在下面介绍的方法与两个原始解决方案略有不同-从这个意义上说,我的方法只创建一个测试,在这个测试中,我循环工厂并对每个工厂运行断言。我无法创建一个更接近原始解决方案的解决方案,这(我相信)是每个工厂的单独测试方法。如果有人能展示这样的实现,那就太酷了

测试/aaa\u工厂测试/factories\u测试.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
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
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
require File.expand_path(File.dirname(__FILE__) + '/test_helper')

class FactoriesTest < ActiveSupport::TestCase
  EXCEPTIONS = %w(griddler_email)
  FactoryBot.factories.map(&:name).each do |factory_name|
    next if factory_name.to_s.in?(EXCEPTIONS)
    context "The  #{factory_name} factory" do
      should 'be valid' do
        factory = build(factory_name)
        assert_equal true, factory.valid?, factory.errors.full_messages
      end
    end
  end
end
我能够成功运行此任务:

-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前置解决方案的原因是,在
Mac OS X
(和其他Unix变体)上,结果按字母顺序排序()

此外,我还预先准备了
aaa\u工厂测试
,以便在默认的
Minitest
任务中首先测试工厂(即运行
bundle exec rake Minitest

lib/tasks/factories\u优先。rake

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
desc 'Run factory specs.'
Rake::TestTask.new(:factory_specs) do |t|
  t.pattern = './spec/factories_spec.rb'
end

task test: :factory_specs
MiniTest::Rails::Testing.default_tasks.unshift('aaa_factories_tests') if Rails.env =~ /^(development|test)\z/
namespace :test do
  desc 'Test factories'
  Rake::TestTask.new(:factories) do |t|
    t.pattern = './test/factories_test.rb'
  end
end

task minitest: 'test:factories'
请注意,上述条件避免了在不可用的环境中错误地引用
Minitest
(我将
Minitest rails
限制为
:test
:development
组)。如果没有此
if
-条件,则推送到Heroku(例如推到
staging
production
)将导致
未初始化常量小测试

当然,我也可以直接运行工厂测试:

bundle exec ruby -I test test/aaa_factories_tests/factories_test.rb

以下是一个不使用规范框架的小型测试解决方案:

测试/工厂测试.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
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
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
require File.expand_path(File.dirname(__FILE__) + '/test_helper')

class FactoriesTest < ActiveSupport::TestCase
  EXCEPTIONS = %w(griddler_email)
  FactoryBot.factories.map(&:name).each do |factory_name|
    next if factory_name.to_s.in?(EXCEPTIONS)
    context "The  #{factory_name} factory" do
      should 'be valid' do
        factory = build(factory_name)
        assert_equal true, factory.valid?, factory.errors.full_messages
      end
    end
  end
end
如果希望工厂测试在其他测试之前运行,最重要的是使用taks minitest而不是task test