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