Minitest - NoMethodError: недефиниран метод `get'

Заседнах с грешка, когато стартирах много прост тест с minitest-rails gem. Имам rails 4.1.5 и minitest 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)


Има много нередни неща в това, което правите. Доколкото разбирам, искате да използвате DSL спецификацията на Minitest във вашите 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. Това е всичко, което трябва да направите, за да активирате Minitest spec DSL във вашите rails тестове. Второ, той добавя псевдонима за context до describe на ActiveSupport::TestCase, което е основата за всички тестове на релсите. Ако искате да добавите тестове, които не наследяват от 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