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