Assert_equal неопределенная локальная переменная LRTHW ex52

Привет, я сделал это в упражнении по лазеру. Изучай Руби Трудный путь, и я прихожу к стене...

Вот тестовый код:

def test_gothon_map()
    assert_equal(START.go('shoot!'), generic_death)
    assert_equal(START.go('dodge!'), generic_death)

    room = START.go("tell a joke")

    assert_equal(room, laser_weapon_armory)
end

И вот код файла, который он должен проверить:

class Room

  attr_accessor :name, :description, :paths

  def initialize(name, description)
    @name = name
    @description = description
    @paths = {}
  end

  def ==(other)
    self.name==other.name&&self.description==other.description&&self.paths==other.paths
  end

  def go(direction)
    @paths[direction]
  end

  def add_paths(paths)
    @paths.update(paths)
    end

end

generic_death = Room.new("death", "You died.")

И когда я пытаюсь запустить тестовый файл, я получаю сообщение об ошибке:

generic_death = Room.new("death", "You died.")

Я попытался установить "generic_death = Room.new("death", "You dead.")" В методе test_gothon_map, и это сработало, но проблема в том, что описание следующего объекта очень длинное, поэтому мои вопросы:

  • почему утверждение не отвечает определенному объекту?
  • может ли это быть сделано иначе, чем путем помещения всего объекта в метод тестирования, поскольку описание следующего объекта очень длинное...

1 ответ

Решение

Природа локальной переменной такова, что они, ну, локально. Это означает, что они недоступны за пределами области их определения.

Вот почему Рубин не знает, что generic_death значит в твоем тесте.

Вы можете решить эту проблему несколькими способами:

  • Определите комнаты как константы в классе Room:

    class Room
      # ...
    
      GENERIC_DEATH = Room.new("death", "You died.")
      LASER_WEAPON_ARMORY = Room.new(...)
    end
    
    def test_gothon_map()
      assert_equal(Room::START.go('shoot!'), Room::GENERIC_DEATH)
      assert_equal(Room::START.go('dodge!'), Room::GENERIC_DEATH)
    
      room = Room::START.go("tell a joke")
    
      assert_equal(room, Room::LASER_WEAPON_ARMORY)
    end
    
  • укажите номер комнаты по имени или по другому идентификатору:

    def test_gothon_map()
      assert_equal(START.go('shoot!').name, "death")
      assert_equal(START.go('dodge!').name, "death")
    
      room = START.go("tell a joke")
    
      assert_equal(room.name, "laser weapon armory")
    end
    
Другие вопросы по тегам