Minitest - NoMethodError: неопределенный метод "получить"

Я застрял с ошибкой, когда запускал очень простой тест с помощью драгоценного камня minitest-rails. У меня рельсы 4.1.5 и минитест 5.4.0

грабли тест:контроллеры

1) Ошибка: DashboardController::index action#test_0001_anonymous: NoMethodError: неопределенный метод get' for #<#<Class:0x00000008e28170>:0x00000008eeb9b8> test/controllers/dashboard_controller_test.rb:6:inblock (3 уровня) в '

Тестовое задание:

require "test_helper"

describe DashboardController do
  context "index action" do
    before do
      get :index
    end
    it { must_respond_with :success }
    it "must render index view" do
      must_render_template :index
    end
  end
end

Мой test_helper:

ENV["RAILS_ENV"] = "test"
require File.expand_path("../../config/environment", __FILE__)
require "rails/test_help"
require "minitest/rails"
require "minitest/rails/capybara"


class MiniTest::Spec
  class << self
    alias :context :describe
  end
end


class RequestTest < MiniTest::Spec
  include Rails.application.routes.url_helpers

  register_spec_type(/request$/, self)
end


class ActionDispatch::IntegrationTest
  # Register "request" tests to be handled by IntegrationTest
  register_spec_type(/Request( ?Test)?\z/i, self)
end

class ActiveSupport::TestCase
  ActiveRecord::Migration.check_pending!

  # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
  #
  # Note: You'll currently still have to declare fixtures explicitly in integration tests
  # -- they do not yet inherit this setting
  fixtures :all

  # Add more helper methods to be used by all tests here...
  extend MiniTest::Spec::DSL
end

person rootatdarkstar    schedule 10.09.2014    source источник
comment
Похоже, вам нужно это   -  person dddd1919    schedule 11.09.2014


Ответы (1)


В том, что вы делаете, много неправильного. Насколько я понимаю, вы хотите использовать спецификацию Minitest DSL в своих тестах Rails, верно? Похоже, вы делаете для этого вещи, которые вам не нужны. Я не понимаю, почему половина этого кода в вашем файле test_helper.rb находится там. Я также подозреваю, что у вас есть другой код, выполняющий действия, которые не отображаются.

Вот что я сделал, чтобы воспроизвести вашу настройку:

$ echo "Creating a new Rails app"
☣ [rails41:rails41] $ rails new undefined_get
☣ [rails41:rails41] $ cd undefined_get/
$ echo "Generate a Dashboard controller"
$ rails g controller dashboard index
$ echo "Add minitest-rails dependencies"
$ echo 'gem "minitest-rails"' >> Gemfile
$ echo 'gem "minitest-rails-capybara"' >> Gemfile
$ bundle install
$ echo "The test runs fine now:"
$ rake test
Run options: --seed 47210

# Running:

.

Finished in 0.457972s, 2.1835 runs/s, 2.1835 assertions/s.

1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
$ echo "Update to your test code and test_helper code"
$ echo "Use whatever editor you want. Not shown here."
$ echo "Now rerun the tests:"
$ rake test
rake aborted!
NoMethodError: undefined method `context' for #<Class:0x007f860258ae50>

Ошибка, которую я получаю, отличается от вашей. Вы назвали метод с context по describe в файле test_helper.rb, но, к сожалению, объект, на который вы указали псевдоним, не входит в цепочку наследования тестовых объектов рельсов. Тестовые объекты рельсов расширяют Minitest::Spec::DSL, но не наследуют Minitest::Spec. Итак, я сильно подозреваю, что предоставленный вами код действительно дает результаты, которые вы представили. Тем не менее, вот код в моем test_helper.rb, который запустит ваш тест:

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/rails"
require "minitest/rails/capybara"

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Allow context to be used like describe
  class << self
    alias :context :describe
  end

  # Add more helper methods to be used by all tests here...
end

Это стандартный test_helper.rb с двумя изменениями. Во-первых, у него есть требования для minitest-rails и minitest-rails-capybara. Это все, что вам нужно сделать, чтобы включить DSL спецификации Minitest в ваших тестах rails. Во-вторых, он добавляет псевдоним для context к describe на ActiveSupport::TestCase, что является основой для всех тестов rails. Если вы хотите добавить тесты, которые не наследуются от ActiveSupport::TestCase, вы также можете использовать псевдоним для Minitest::Spec, но это не поможет вам использовать context в тестах вашего контроллера.

Все еще здесь? Хорошо. Так почему же ваш код дал вам другую ошибку, чем моя? Вероятно, тестовый объект, используемый для тестов вашего контроллера, не ActionController::TestCase. Я говорю это, потому что ваша ошибка была undefined method get. Метод get определяется ActionController::TestCase и отсутствует в Minitest::Spec. Итак, вы каким-то образом испортили конфигурацию Minitest. Простой способ убедиться, что ваши тесты используют правильные тестовые объекты, — добавить в тест дополнительное утверждение. Так:

require "test_helper"

describe DashboardController do
  context "index action" do
    before do
      # Make sure we are using the correct test class
      self.class.ancestors.must_include ActionController::TestCase
      # Continue with setup
      get :index
    end
    it { must_respond_with :success }
    it "must render index view" do
      must_render_template :index
    end
  end
end

Если это первое утверждение терпит неудачу, значит, вы сделали что-то не так в своей конфигурации.

person blowmage    schedule 12.09.2014