2015-01-11 2 views
4

Без MiniTest/спецификации, тест выглядят следующим образом, и my_engine_customers светильников загружаются (все хорошо):NoMethodError <имя арматуры> в Rails и MiniTest/спецификации

my_engine/test/models/my_engine/customer_test.rb является

require 'test_helper' 

module MyEngine 
    class CustomerTest < ActiveSupport::TestCase 

    test "alex is id 5" do 
     assert my_engine_customers(:alex).id, 5 
    end 

    end 
end 

После добавления require 'minitest/autorun' к test/test_helper.rb, а затем преобразования выше тест:

require 'test_helper' 

describe MyEngine::Customer do 

    let(:alex) { my_engine_customers(:alex) } # error here (error shown below) 

    it "alex is id 5" do 
    assert alex.id, 5 
    end 

end 

я получаю это ошибка:

NoMethodError: undefined method `my_engine_customers' for 
#<#<Class:0x007fb63e8f09e8>:0x007fb63e81b068> 

Как получить доступ к светильникам при использовании minitest/spec?

ответ

7

Когда вы используете спецификацию DSL, вы получаете объект Minitest::Spec для запуска тестов. Но средства Rails и транзакция базы данных доступны только в ActiveSupport::TestCase или тестируют классы, которые наследуют от него, как ActionController::TestCase. Так что вам нужен какой-то способ для спецификации DSL использовать ActionSupport::TestCase для тестирования.

Для этого есть два шага, сначала ActiveSupport::TestCase должен поддерживать спецификацию DSL. Вы можете сделать это, добавив следующий код вам test_helper.rb файла:

class ActiveSupport::TestCase 
    # Add spec DSL 
    extend Minitest::Spec::DSL 
end 

(?. Знаете ли вы, ActiveSupport::TestCase.describe существует Возможно, вы хотите удалить этот метод, прежде чем добавить спецификации DSL, если вы планируете делать вложенным описывает)

Во-вторых, вам нужно сообщить спецификации DSL, чтобы использовать ActiveSupport::TestCase. Спецификация DSL добавляет register_spec_type для этой цели. Так же добавьте следующую строку в файл test_helper.rb:

class ActiveSupport::TestCase 
    # Use AS::TestCase for the base class when describing a model 
    register_spec_type(self) do |desc| 
    desc < ActiveRecord::Base if desc.is_a?(Class) 
    end 
end 

Это будет смотреть на предмет описательной и если это модель ActiveRecord он будет использовать ActiveSupport::TestCase вместо Minitest::Spec для запуска тестов.

Как и следовало ожидать, в попытке использовать спецификацию DSL для контроллеров и других типов тестов, как и следовало ожидать, есть много других проблем. Самый простой способ ИМО - добавить зависимость от minitest-rails, а затем require "minitest/rails" в вашем файле test_helper.rb. minitest-rails делает всю эту конфигурацию и многое другое и делает процесс более плавным. (Опять же, ИМО.)

Для получения дополнительной информации см. Мое сообщение blaurgh Adding Minitest Spec in Rails 4. </бесстыдный-самореклама >