rake прерван после запуска тестов и (преднамеренного) сбоя, перед печатью сообщений об ошибках

#ruby #testing #rspec #rake

#ruby #testing #rspec #rake #тестирование

Вопрос:

Я выполняю руководство по TestFirst и не могу пройти первую задачу из-за некоторых проблем с Rake (и rspec в целом).

Тесты, которые я пытаюсь запустить:

 require 'hello'

describe "the hello function" do
  it "says hello" do
    hello.should == "Hello!"
  end
end

describe "the greet function" do
  it "says hello to someone" do
    greet("Alice").should == "Hello, Alice!"
  end

  it "says hello to someone else" do
    greet("Bob").should == "Hello, Bob!"
  end
end
  

Я зашел так далеко, что создал файл hello.rb (в соответствии с руководством) и добавил

 def hello
end
  

Для справки, перед тем, как я создал файл, я получил длинный вывод, в котором говорилось, что запрос «hello» не работал, как ожидалось, и после создания файла, который исчез. Так что все работало нормально.

Когда я запускаю команду rake, мой вывод (выделенная жирным шрифтом часть — моя главная проблема):

wendy@wendy-EL1352:~/the_odin_project/learn_ruby/00_hello $ rake (в / home/wendy/the_odin_project/learn_ruby)

функция hello сообщает hello (СБОЙ — 1)

Сбои:

1) функция hello сообщает о сбое / ошибке hello: hello.следует == «Привет!» ожидалось: «Привет!» получено: nil (используя ==) # ./00_hello/hello_spec.rb:120: в `блоке (2 уровня) в ‘

Предупреждения об устаревании:

Использование should старого :should синтаксиса rspec-expectations без явного включения > синтаксис устарел. Используйте новый :expect синтаксис или явно включите :should > вместо этого. Вызывается из /home/wendy/the_odin_project/learn_ruby/00_hello/hello_spec.rb:120:in >`блокировать (2 уровня) в’.

Если вам нужно больше обратной трассировки для любого из этих устареваний, чтобы определить, где внести необходимые изменения, вы можете настроить config.raise_errors_for_deprecations! , и это превратит предупреждения об устаревании в ошибки, предоставляя вам полную обратную трассировку.

Всего 1 предупреждение об устаревании

Завершен за 0,00334 секунды (загрузка файлов заняла 0,14558 секунды) 1 пример, 1 сбой

Неудачные примеры:

rspec ./00_hello/hello_spec.rb:119 # функция hello сообщает, что hello rake прерван! /home/wendy/.rvm/rubies / ruby-2.0.0-p481/bin/ruby -S rspec /home/wendy/the_odin_project/learn_ruby/00_hello /hello_spec.rb -I/home/венди/the_odin_project/learn_ruby/00_hello -I/home/ венди /the_odin_project/ ошибка learn_ruby/00_hello/solution -f documentation -r ./rspec_config /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/gems/rspec-core-2.13.1/lib/rspec/core/rake_task.rb:156:in run_task'
/home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/gems/rspec-core-2.13.1/lib/rspec/core/rake_task.rb:124:in
блок (2 уровня) в initialize’ /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/gems/rspec-core-2.13.1/lib/rspec/core/rake_task.rb:122:in задачи `блокировать при инициализации’: TOP => default => spec (Смотрите полную трассировку, запустив задачу с помощью —trace)

I’m not hugely concerned with the deprecation warning (I’ve looked through enough to be reasonably certain these aren’t related). Although if you think that’s the cause I’ll bow my head in shame. I do need to figure out how to either rewrite the specs or change the config settings, but I have faith that I can do that myself. My real concern here is that Rake has access to the tests and can run them, but aborts before showing the error messages.

If I run rspec hello_spec.rb the output is here:

wendy@wendy-EL1352:~/the_odin_project/learn_ruby/00_hello$ rspec hello_spec.rb
/home/wendy/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in require': cannot load such file -- hello (LoadError)
from /home/wendy/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in
require’
from /home/wendy/the_odin_project/learn_ruby/00_hello/hello_spec.rb:116:in <top (required)>'
from /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/gems/rspec-core-3.0.2/lib/rspec/core/configuration.rb:1057:in
load’
from /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/gems/rspec-core-3.0.2/lib/rspec/core/configuration.rb:1057:in block in load_spec_files'
from /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/gems/rspec-core-3.0.2/lib/rspec/core/configuration.rb:1057:in
each’
from /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/gems/rspec-core-3.0.2/lib/rspec/core/configuration.rb:1057:in load_spec_files'
from /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/gems/rspec-core-3.0.2/lib/rspec/core/runner.rb:97:in
setup’
from /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/gems/rspec-core-3.0.2/lib/rspec/core/runner.rb:85:in run'
from /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/gems/rspec-core-3.0.2/lib/rspec/core/runner.rb:70:in
run’
from /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/gems/rspec-core-3.0.2/lib/rspec/core/runner.rb:38:in invoke'
from /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/gems/rspec-core-3.0.2/exe/rspec:4:in

from /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/bin/rspec:23:in load'
from /home/wendy/.rvm/gems/ruby-2.0.0-p481@railstutorial_rails_4_0/bin/rspec:23:in

So I’m kind of wondering why running rake has no problem linking the required hello.rb file but the rspec command doesn’t. I just want to get these tests to run (and fail) properly so I can get on with the task.

The rakefile:

 # This Rakefile has all the right settings to run the tests inside each lab
gem 'rspec', '~>2'
require 'rspec/core/rake_task'

task :default => :spec

desc "run tests for this lab"
RSpec::Core::RakeTask.new do |task|
  lab = Rake.application.original_dir
  task.pattern = "#{lab}/*_spec.rb"
  task.rspec_opts = [ "-I#{lab}", "-I#{lab}/solution", '-f documentation', '-r ./rspec_config']
  task.verbose = false
end
  

Adding gem ‘ruby gems’ does nothing but add more confusion to the outputs.

I have initialized rspec with rspec —init in previous attempts at this, both in the 00_hello directory as well as in the learn_ruby directory. In this case, I run into exactly the same error messages.

I’ve been going at learning Ruby and Rails for the past few months. Once or twice I’ve almost asked a question here, but I’ve ended up finding my answer halfway through drafting it. I am not having that kind of luck this time. I am truly stumped. Please help.

Thank you.

Edit with more info on rspec —init and use of ‘spec_helper’

in the 00_hello folder, rspec —init and then including the spec_helper in the hello_spec.rb (as shown above — I included require ‘spec_helper’ below the require ‘hello’) produces the following error when run with the rake command:

wendy@wendy-EL1352:~/the_odin_project/learn_ruby/00_hello$ rake (in
/home/wendy/the_odin_project/learn_ruby)
/home/wendy/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in
`require’: cannot load such file — spec_helper (LoadError)

In the learn_ruby directory, I get the same output as above, where the tests run well enough to fail, but then I see rake abort! before the errors are listed and the same error as before:

the hello function says hello (FAILED — 1)

Failures:

1) the hello function says hello
Failure/Error: hello.should == «Hello!»
NameError:
undefined local variable or method hello' for #<RSpec::ExampleGroups::TheHelloFunction:0x00000002989278>
# ./00_hello/hello_spec.rb:122:in
block (2 levels) in ‘

Finished in 0.00094 seconds (files took 0.16985 seconds to load) 1
example, 1 failure

Failed examples:

rspec ./00_hello/hello_spec.rb:121 # the hello function says hello
rake aborted! /home/wendy/.rvm/rubies/ruby-2.0.0-p481/bin/ruby -S
rspec /home/wendy/the_odin_project/learn_ruby/00_hello/hello_spec.rb
-I/home/wendy/the_odin_project/learn_ruby/00_hello -I/home/wendy/the_odin_project/learn_ruby/00_hello/solution -f documentation -r ./rspec_config failed

(the reason the test failure is different is because I’ve gone back to just having the hello.rb file created without inserting the class name into the file — the tests are half running, but the rake aborted! won’t go away)

This guy:

-I/home/wendy/the_odin_project/learn_ruby/00_hello/solution -f documentation -r ./rspec_config failed

can be found in the Rakefile:

 RSpec::Core::RakeTask.new do |task|
  lab = Rake.application.original_dir
  task.pattern = "#{lab}/*_spec.rb"
  **task.rspec_opts = [ "-I#{lab}", "-I#{lab}/solution", '-f documentation', '-r ./rspec_config']**
  task.verbose = false
end
  

But I do not have enough understanding of Rake to even parse apart Google search results for problems with that line, or find what search terms to use to find relevant information. :/

Комментарии:

1. Это вся спецификация? там нет require "spec_helper" строки? (Примечание: я не хочу загружать весь архивированный учебник, чтобы проверить, каким он должен быть … это основано на моих знаниях об обычных спецификациях).

2. При первоначальной загрузке отсутствует файл spec_helper. Я обновлю исходный вопрос с более подробной информацией об этом. Попытка rspec —init, а затем включить ‘spec_helper’ вызывает другую ошибку. Я пройду через различные попытки и включу выходные данные в свой OP.