Има много нередни неща в това, което правите. Доколкото разбирам, искате да използвате 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