2

I am doing exercises and am getting NameError:Unitialized Constant MyUnitTests::Room when running test_ex47.rb.

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 is located in the lib folder and looks like:

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

Error:

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]
2
  • 1
    Not sure if this is just in your question and not in your actual code, but in the Room class you currently have aatr_accessor rather than attr_accessor. Commented Apr 26, 2012 at 7:21
  • Thanks mikej. Fixed that and a few other such things, stil the same error. >:| Commented Apr 27, 2012 at 0:35

1 Answer 1

3

The problem here is that you are creating a Room object inside the MyUnitTests class on line 3. Ruby thinks you want to use a class called MyUnitTest::Room, which doesn't exist. You need to use an absolute class reference, like so:

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

Notice the :: before Room.new on line 3 there? That tells Ruby that you want to create a Room object from the top level name space :)

I hope that answers your question.

EDIT: You'll also need to change your other references to the Room class to ::Room. Sorry, I thought only the top one was a problem because of the indentation. A closer look reveals that the rest need the :: as well.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.