2016-11-12 1 views
2

В основном я пытаюсь ответить на ряд инструкций Rspec. Одна из этих инструкций заключается в следующем:Продолжайте получать ошибки, используя Raise, пытающийся ответить Rspec на raise_error в Ruby?

it "fails informatively when there's not enough values stacked away" do 
    expect { 
    calculator.plus 
    }.to raise_error("calculator is empty") 
end 

Так я узнал о raise_error и как ответить на него, это был я, чтобы создать какой-то ошибки/исключения.

def plus 
    @array_nums.length >= 2 ? @array_nums << @array_nums.pop + @array_nums.pop : raise {"calculator is empty"} 
    @value = @array_nums[-1] 

Чтобы быть ясным, есть конец внизу, но текстовый редактор не обрабатывал его. Поэтому я поднимаю эту ошибку, я попытался поднять ArgumentError и все это, но я получаю этот ответ от RSpec:

Failure/Error: 
    expect { 
    calculator.plus 
    }.to raise_error("calculator is empty") 

    expected Exception with "calculator is empty", got RuntimeError with backtrace: 
    # ./lib/12_rpn_calculator.rb:16:in `plus' 
    # ./spec/12_rpn_calculator_spec.rb:119:in `block (3 levels) in <top (required)>' 
    # ./spec/12_rpn_calculator_spec.rb:118:in `block (2 levels) in <top (required)>' 
# ./spec/12_rpn_calculator_spec.rb:118:in `block (2 levels) in <top (required)>' 

Любых других поднятых ошибок я стараюсь просто не работаю, и я «Я пытаюсь найти правильное направление, чтобы принять это. Может быть, я смотрю не туда?

Извините, что задал этот вопрос еще раз, но я пробовал все и не хочу иметь никаких ошибок. Если вы хотите проверить комментарии другого пользователя here is the URL.

ответ

1

изменение raise {"calculator is empty"} до raise("calculator is empty"). raise может принимать строковый аргумент, а не блок.

+0

Спасибо за ответ, но не идти. Что странно - это единственный раз, когда код действительно будет запущен, если строка находится в блоке. Возможно, мне стоит упомянуть, что я все это делаю в IDE c9. Когда я запускал его по-своему, я это ошибка, я получил 'rspec spec/12_rpn_calculator_spec.rb /usr/local/rvm/gems/ruby-2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1435:in \ 'load ':/home/ubuntu/Рабочая область/test-first-ruby-master/lib/12_rpn_calculator.rb: 16: синтаксическая ошибка, неожиданный tSTRING_BEG, ожидающий ключевое слово_do или '{' или '(' (SyntaxError) ... pop + @ array_nums.pop: raise " калькулятор пуст »' –

+0

выглядит так, как будто нужна явная скобка, когда внутри тернарного оператора отредактирован ответ, чтобы добавить их. – baseballlover723

+0

Такая же ошибка, может быть, это что-то связано с IDE? В любом случае, спасибо за вашу помощь, я просто решил изменить код raise_error в rspec, чтобы использовать RunTimeError в качестве аргумента вместо строки, и теперь он работает. Вероятно, это не правильное решение, но на данный момент это нужно будет сделать. –

3

Основная проблема заключается в том, что Kernel#raise не принимает блок ({...}) в качестве параметров. Он принимает исключение или строку.

Следующая проблема, с которой вы сталкиваетесь, - это скобки. Хотя во многих случаях вы можете опустить круглые скобки, вы не можете делать это все время. Причина в другом - operator precedences. Приоритет операторов может запутать разработчиков и привести Ruby к неожиданному прочтению кода. Например:

condition ? operation : raise "calculator is empty" 

# what the devs thinks Ruby would understand: 
condition ? operation : raise("calculator is empty") 

# what Ruby really understands: 
(condition ? operation : raise) "calculator is empty" 

На самом деле - наиболее известный стиль руководство предлагает не опускать скобки в большинстве случаев и позволяют опустить в качестве исключения в некоторых.

Кроме того, мне кажется, что вы пытаетесь сделать многое в одном: есть тройной, два звонка pop, задание и raise. Это делает код трудным для чтения, трудно понять и подвержен ошибкам. В этом конкретном примере я бы предложил использовать пункт охраны в начале метода и удалите троичной на всех:

def plus 
    raise(ArgumentError, 'calculator is empty') if @numbers.length < 3 

    @numbers << @numbers.pop + @numbers.pop 
    # ... 

Вы заметите, что я также явно указать вид exception: ArgumentError кажется, чтобы описать выпуск лучший. И я бы назвал переменные по-разному.

Каждый язык, который имеет свой собственный стиль, лучшие практики, соглашения об именах и идиомы. Это стоит того, чтобы понимать и следовать этим конвенциям. Вы можете захотеть взглянуть на хорошо известные направляющие рубин стиле, как:

Смежные вопросы