2013-11-14 2 views
2

Я нашел запись в блоге около Testing Factories First (от BigBinary - это версия Minitest/spec Thoughtbot's RSpec original).Как проверить фабрики Сначала с помощью Minitest, но без спецификации?

Не могли бы вы показать мне эквивалент без каркас spec - только с минимальным (Rails)?

Thoughtbot подход (RSpec)

спецификации/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 

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 

BigBinary подход (Minitest, спецификации)

спецификации/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 

Библиотека/Задачи/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)?

ответ

1

Подход, представленный ниже, несколько отличается от двух оригинальных решений - в том смысле, что мой подход создает только один тест, в течение которого я прохожу через фабрики и выполняю утверждение против каждого. Я не смог создать решение, которое ближе подражает оригинальным решениям - что (я считаю) - отдельный метод тестирования для каждой фабрики. Если бы кто-то мог показать такую ​​реализацию, это было бы круто.

тест/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 

Благодаря пути Minitestworks out of the box - добавить любые каталоги под test/ и minitest-rails автоматически создаст соответствующие реки задачу для него. Итак, скажем, вы добавили каталог 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 

причина ааа препендом решение MiniTest does a Dirglob и на Mac OS X (и другие варианты Unix) результаты сортируются по алфавиту (though the results differ across different platforms).

Как хорошо, я предваряется the default_tasks array с aaa_factories_tests иметь заводы испытаны сначала в Minitest по умолчанию задача (т.е. при выполнении bundle exec rake minitest).

Библиотека/Задачи/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 
0

Вот решение для MiniTest без рамки спецификации:

тест/factories_test.rb

require File.expand_path(File.dirname(__FILE__) + '/test_helper') 

class FactoriesTest < ActiveSupport::TestCase 
    EXCEPTIONS = %w(griddler_email) 
    FactoryGirl.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 
     assert_equal true, build(factory_name).valid? 
     end 
    end 
    end 
end 

lib/tasks/factory.rake

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 вместо задачи тест если вы хотите испытания фабрики, которые будут выполняться до других испытаний.

Смежные вопросы