2012-04-26 3 views
2

Я делаю exercises и am получает NameError:Unitialized Constant MyUnitTests::Room при запуске test_ex47.rb.Ошибка названия Ruby - неинициализированная константа

test_ex47.rb:

require 'test/unit' 
require_relative '../lib/ex47' 

class MyUnitTests < Test::Unit::TestCase 
    def test_room() 
     gold = Room.new("Gold Room", """This room has gold in it you can grab. There's a doo to the north.""") 
    assert_equal(gold.name, "GoldRoom") 
    assert_equal(gold.paths, {}) 
end 

def test_room_paths() 
    center = Room.new("Center", "Test room in the center.") 
    north = Room.new("North", "Test room in the north.") 
    south = Room.new("South", "Test room in the south.") 

    center.add_paths({:north => north, :south => south}) 
    assert_equal(center.go(:north), north) 
    assert_equal(center.go(:south), south) 
end 

def test_map() 
    start = Room.new("Start", "You can go west and down a hole.") 
    west = Room.new("Trees", "There are trees here, you can go east.") 
    down = Room.new("Dungeon", "It's dark down here, you can go up.") 

    start.add_paths({:west => west, :down => down}) 
    west.add_paths({:east => start}) 
    down.add_paths({:up => start}) 

    assert_equal(start.go(:west), west) 
    assert_equal(start.go(:west).go(:east), start) 
    assert_equal(start.go(down).go(up), start) 
end 

end 

ex47.rb находится в папке Lib и выглядит следующим образом:

class Room 
aatr_accessor :name, :description, :paths 

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

def go(direction) 
    @paths[direction] 
end 

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

Ошибка:

Finished tests in 0.000872s, 3440.3670 tests/s, 0.0000 assertions/s. 

    1) Error: 
test_map(MyUnitTests): 
NameError: uninitialized constant MyUnitTests::Room 
    test_ex47.rb:22:in `test_map' 

    2) Error: 
test_room(MyUnitTests): 
NameError: uninitialized constant MyUnitTests::Room 
    test_ex47.rb:6:in `test_room' 

    3) Error: 
test_room_paths(MyUnitTests): 
NameError: uninitialized constant MyUnitTests::Room 
    test_ex47.rb:12:in `test_room_paths' 

3 tests, 0 assertions, 0 failures, 3 errors, 0 skips] 
+1

Не уверен, что это только в вашем вопросе, а не в вашем фактическом коде, но в классе 'Room' у вас в настоящее время есть' aatr_accessor', а не 'attr_accessor'. – mikej

+0

Спасибо mikej. Исправлено это и несколько других подобных вещей, чтобы сделать ту же ошибку. >: | – septerr

ответ

3

Проблема здесь в том, что вы создают объект Room внутри класса MyUnitTests в строке 3. Ruby думает, что вы хотите использовать класс MyUnitTest :: Room, whi ch не существует. Вы должны использовать ссылку на абсолютный класс, например, так:

class MyUnitTests < Test::Unit::TestCase 
    def test_room() 
     gold = ::Room.new("Gold Room", """This room has gold in it you can grab. There's a doo to the north.""") 
    assert_equal(gold.name, "GoldRoom") 
    assert_equal(gold.paths, {}) 
end 

Обратите внимание на :: до того Room.new на линии 3 там? Это говорит Ruby, что вы хотите создать объект Room из пространства имен верхнего уровня :)

Надеюсь, что ответ на ваш вопрос.

РЕДАКТИРОВАТЬ: Вам также нужно будет изменить другие ссылки на класс комнаты до: Комната. Извините, я думал, что только верхняя часть была проблемой из-за отступов. Более пристальный взгляд показывает, что остальные нуждаются также.