Ошибка броска теста рейка в пакете exec

Здравствуйте, я новичок в рейл. Я слежу за railstutorial.org Майкла Хартла. Я застрял в главе 4, листинге 4.5: когда я нажимаю $ bundle exec rake test, он показывает результат, отличный от того, который должен был отображаться в соответствии с руководством. Примечание. В качестве платформы я использую Ubuntu 15.10.

Результат, когда я нажму $ bundle exec rake test

  /home/shyambhimani/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/minitest-reporters-1.0.5/lib/minitest/minitest_reporter_plugin.rb:8:in `block in plugin_minitest_reporter_init': undefined method `add_defaults' for #<Guard::Minitest::Reporter:0x005580a1496930> (NoMethodError)
  from /home/shyambhimani/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/minitest-reporters-1.0.5/lib/minitest/minitest_reporter_plugin.rb:6:in `each'
  from /home/shyambhimani/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/minitest-reporters-1.0.5/lib/minitest/minitest_reporter_plugin.rb:6:in `plugin_minitest_reporter_init'
  from /home/shyambhimani/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/minitest-5.8.4/lib/minitest.rb:74:in `block in init_plugins'
  from /home/shyambhimani/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/minitest-5.8.4/lib/minitest.rb:72:in `each'
  from /home/shyambhimani/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/minitest-5.8.4/lib/minitest.rb:72:in `init_plugins'
  from /home/shyambhimani/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/minitest-5.8.4/lib/minitest.rb:123:in `run'
  from /home/shyambhimani/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/minitest-5.8.4/lib/minitest.rb:56:in `block in autorun'

приложение.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= stylesheet_link_tag    'application', media: 'all',
                                              'data-turbolinks-track' => true %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
    <%= csrf_meta_tags %>
  </head>
  <body>
    <%= yield %>
  </body>
</html>

application_helper.rb

module ApplicationHelper

  # Returns the full title on a per-page basis.
  def full_title(page_title = '')
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty?
      base_title
    else
      page_title + " | " + base_title
    end
  end
end

static_pages_controller_test.rb

require 'test_helper'

class StaticPagesControllerTest < ActionController::TestCase
  test "should get home" do
    get :home
    assert_response :success
    assert_select "title", "Ruby on Rails Tutorial Sample App"
  end

  test "should get help" do
    get :help
    assert_response :success
    assert_select "title", "Help | Ruby on Rails Tutorial Sample App"
  end

  test "should get about" do
    get :about
    assert_response :success
    assert_select "title", "About | Ruby on Rails Tutorial Sample App"
  end
end

test_helper.rb

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/reporters"
Minitest::Reporters.use!

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

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

Gemfile

source 'https://rubygems.org'

gem 'rails',        '4.2.6'
gem 'sass-rails',   '5.0.2'
gem 'uglifier',     '2.5.3'
gem 'coffee-rails', '4.1.0'
gem 'jquery-rails', '4.0.3'
gem 'turbolinks',   '2.3.0'
gem 'jbuilder',     '2.2.3'
gem 'sdoc',         '0.4.0', group: :doc

group :development, :test do
  gem 'sqlite3',     '1.3.9'
  gem 'byebug',      '3.4.0'
  gem 'web-console', '2.0.0.beta3'
  gem 'spring',      '1.1.3'
end

group :test do
  gem 'minitest-reporters', '1.0.5'
  gem 'mini_backtrace',     '0.1.3'
  gem 'guard-minitest',     '2.3.1'
end

group :production do
  gem 'pg',             '0.17.1'
  gem 'rails_12factor', '0.0.2'
end

Подскажите пожалуйста как избавиться от ошибки.


person Shyam Bhimani    schedule 05.05.2016    source источник
comment
Думали ли вы о том, чтобы сделать то, что вас просит сделать сообщение об ошибке?   -  person MarsAtomic    schedule 06.05.2016
comment
Я не могу понять, что говорит сообщение об ошибке. Можете ли вы уточнить, какие шаги я должен предпринять? @MarsAtomic   -  person Shyam Bhimani    schedule 06.05.2016
comment
покажи свой файл фикстуры   -  person uday    schedule 10.05.2016
comment
Как выглядит ваш Gemfile?   -  person spickermann    schedule 10.05.2016
comment
Я добавил Gemfile. Я обновил рельсы до 4.2.6. @спикерманн   -  person Shyam Bhimani    schedule 10.05.2016


Ответы (4)


Похоже, вы используете RubyDep, инструмент, помогающий избежать небезопасных версий Ruby. RubyDep говорит вам в первой строке:

RubyDep: ВНИМАНИЕ: ваш Ruby имеет уязвимости в системе безопасности! Пожалуйста, обновите! (...)

Глядя на путь (.../.rbenv/versions/2.2.3/...) других строк трассировки стека, похоже, что вы используете Ruby версии 2.2.3, установленную с помощью rbenv.

И RubyDep прав: в Ruby 2.2.3 есть известная уязвимость.

Доступны более новые версии Ruby. Вы можете выполнить обновление до последней версии 2.2.x (или последней версии 2.3.x). Я предлагаю перейти на 2.2.5, потому что я не знаю, совместим ли туториал с 2.3.x.

Чтобы обновить Ruby до более новой версии с rbenv, выполните следующие действия (полагаю, вы использовали brew для установки rbenv):

brew update               # update to the latest brew version
brew upgrade ruby-build   # update Ruby version library
brew upgrade rbenv        # update rbenv
rbenv install 2.2.5       # install Ruby 2.2.5

Установите 2.2.5 на версию Ruby по умолчанию:

rbenv global 2.2.5

Обновите приложение Rails, чтобы использовать эту версию Ruby. Для этого проверьте следующие файлы (если они существуют, они могут быть скрыты) и измените версию Ruby в этих файлах:

.ruby-version
Gemfile

Возможно, вы захотите проверить в корне ваших приложений, что вы используете обновленную версию Ruby:

ruby -v                   # should return `ruby 2.2.5p...`

Последний шаг — переустановить драгоценные камни:

gem install bundler
bundler install

Обновление прошло успешно?

bundle exec rake test
person spickermann    schedule 10.05.2016
comment
@ShyamBhimani похоже, что вы, должно быть, обновили свои драгоценные камни, когда обновили свой Ruby, иначе невозможно, чтобы указанная выше трассировка стека исчезла. - person photoionized; 13.05.2016

Попробуй это

export RUBY_DEP_GEM_SILENCE_WARNINGS=1

Если это не сработает, попробуйте установить более старую версию Guard или Minitest.

gem list Minitest

*** LOCAL GEMS ***

minitest (5.8.4, 5.7.0, 5.6.1, 4.7.5)

Используйте gem help install, чтобы узнать, как установить версию, отличную от последней.

Иногда новая версия содержит ошибки и несовместима со старой версией Ruby или Rails.

person Chloe    schedule 10.05.2016

Проблема

Похоже, ваша реальная проблема заключается в вашей версии minitest-reporters. Копаясь как в источнике guard-minitest, так и в minitest-reporters, похоже, что minitest-reporters использовались для вызова методов io и add_defaults во всех используемых плагинах minitest. Судя по всему, сам minitest никогда не определял метод add_defaults ни в одном из своих Reporter'ов. Похоже, что сам гем minitest-reporters определяет кучу пользовательских репортеров, для которых определено add_defaults, но, похоже, он взрывается на всем, что наследуется непосредственно от самого гема minitest, как это делает guard-minitest.

Решение

К счастью, похоже, что гем minitest-reporters фактически исправил это как ошибку, ничего не говоря об этом, особенно в этот коммит. Обратите внимание на вызов respond_to? в строке 47, который должен исправить эту конкретную трассировку стека, которую вы получаете.

Это означает, что вам следует обновить версию minitest-reporters. Похоже, первая версия с этим исправлением — minitest-reporters 1.1.2. Поэтому вы должны изменить свой Gemfile, чтобы использовать по крайней мере эту версию.

Некоторые советы

Тем не менее, в соответствии с общей практикой Ruby, особенно с такими вещами, как тестирование, на самом деле нет причин закреплять ваши версии в вашем Gemfile. Что бы я сделал, так это просто удалил версию для minitest-reporters из Gemfile и проверил свой Gemfile.lock, чтобы полагаться на определенные установленные версии. Это облегчит обновление ваших зависимостей.

Редактировать

Извините, похоже, я немного ошибся в том, где это было исправлено. Нашел настоящий коммит, он здесь:

https://github.com/kern/minitest-reporters/commit/8e3a8e0a195e31d97a35e4d8b7d >

Похоже, что это было введено в версии 1.0.11. Таким образом, ваш Gemfile просто должен использовать по крайней мере это вместо этого, как в:

gem 'minitest-reporters', '1.0.11'
person photoionized    schedule 12.05.2016

В вашем Gemfile просто удалите конкретную версию рядом с геммой minitest_reporters и запустите установку пакета — minitest_reporters добавил исправление в более позднюю версию, чем 1.0.5.

person Anand    schedule 13.05.2016