2012-04-26 3 views
2

test_ex47.rb를 실행할 때 exercises이고 이 되니까 NameError:Unitialized Constant MyUnitTests::Room이됩니다.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' 클래스에 있는지 확인하려면'attr_accessor'가 아니라'aatr_accessor'가 있어야합니다. – mikej

+0

감사합니다. mikej. 이 문제와 몇 가지 다른 점을 수정하여 같은 오류가 발생했습니다. > : | – septerr

답변

3

여기서 문제는 당신이다 3 행의 MyUnitTests 클래스 안에 Room 객체를 만들고 있습니다. 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 

여기에 3 번 라인의 Room.new가 있습니다. Ruby는 최상위 이름 공간에서 Room 객체를 만들고 싶다고 말합니다.

질문에 대한 답변이되기를 바랍니다.

편집 : Room 클래스에 대한 다른 참조를 :: Room으로 변경해야합니다. 죄송합니다. 톱니 모양 때문에 맨 위의 문제 만 문제라고 생각했습니다. 자세히 보면 나머지도 ::이 필요하다는 것을 알 수 있습니다.