Помощь с Ruby Koans # 6 - Какое исключение поймали?

Я пытаюсь изучить Ruby через Koans, но я застрял на шестом шаге.

Здесь код:

def test_you_dont_get_null_pointer_errors_when_calling_methods_on_nil  
  # What happens when you call a method that doesn't exist.    
  # The following begin/rescue/end code block captures the exception and  
  # make some assertions about it.  

  begin
    nil.some_method_nil_doesnt_know_about
  rescue Exception => ex
    # What exception has been caught?
    assert_equal __, ex.class

    # What message was attached to the exception?
    # (HINT: replace __ with part of the error message.)
    assert_match(/__/, ex.message)
  end
end

Я знаю, что я должен заменить __ чем-то связанным с сообщением об ошибке "NoMethodError", но я не могу понять это.

Это сообщение об ошибке, которое я получаю при запуске "path_to_enlightenment.rb":

The answers you seek...
  <"FILL ME IN"> expected but was  <NoMethodError>.

Я был бы очень признателен за некоторые рекомендации с этим - это сводит меня с ума! Я хотел бы узнать ответ и возможное объяснение. Спасибо!

Ответ 1

Ответ здесь - "NoMethodError"

вам нужно, чтобы элементы с обеих сторон были равны, поэтому их оба ex.class будут делать это.

Затем вам нужно перейти к/__/Ниже.

Ответ 2

Мне пришлось поставить утверждение assert_equal в parens, чтобы передать это. Должна быть ошибка.

  def test_you_dont_get_null_pointer_errors_when_calling_methods_on_nil
    # What happens when you call a method that doesn't exist.  The
    # following begin/rescue/end code block captures the exception and
    # make some assertions about it.
    begin
      nil.some_method_nil_doesnt_know_about
    rescue Exception => ex
      # What exception has been caught?
      assert_equal(NoMethodError, ex.class)

      # What message was attached to the exception?
      # (HINT: replace __ with part of the error message.)
      assert_match("undefined method", ex.message)
    end
  end

Ответ 3

Вам нужно заменить __ фактическим

assert_equal NoMethodError, ex.class 

Ответ 4

У Карло Ледесмы есть правильный ответ. (assert_equal NoMethodError, ex.class) Не знаю, почему ответ Эллиота считается самым высоким, если кто-то попросит вас решить уравнение, 2x + 2 = 10, вы не отвечаете 2x + 2 = 2x + 2. Математически вы были бы правы, но это не ответ.

Ответ 5

Я просто решил это. Я был сосредоточен на одной строке за раз, но этот метод включает в себя два элемента, которые нужно изменить: один в строке 16, один в строке 20. Оба должны пройти урок.

16: assert_equal NoMethodError, ex.class

20: assert_match(/*some_method_nil_doesnt_know_about*/, ex.message)

Надеюсь, что это поможет кому-то, кто застрял!

Ответ 6

В строке 20 я использовал это: assert_match(/some_method_nil_doesnt_know_about/, ex.message) Я не знаю, для чего предназначены эти символы /. Мне придется исследовать его, но это сработало.

Я думаю, что трюк состоял в том, что 'some_method_nil_doesnt_know_about был в одинарных кавычках в сообщении, поэтому он искал это.

Ответ 7

Я только на Koen 83, но в большинстве Koens вы можете найти "ответ" в разделе, соответствующим названию "The answers you seek..." сразу после "<"FILL ME IN"> expected but was". Время от времени я нарушал рамки RubyKoan, и я получаю этот старинный графический ascii (я не уверен, что это должно быть чашевидные руки или дерево, но, надеюсь, вы это знаете, когда увидите это); в этих случаях сообщение об ошибке ниже графика ascii было полезным.

Ответ 8

когда вы заполняете NoMethodError, вам также нужно заполнить сообщение об ошибке (что-то похожее на "метод w90 > some_methd.." ), вы должны заменить все/__/своим термином не только подчеркивания

Ответ 9

Если вы удаляете кавычки, вы можете добавить немного сообщения об ошибке

assert_match(/undefined method/, ex.message)