2

私は演習NameError:Unitialized Constant MyUnitTests::Roomを行っており、 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は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]
4

1 に答える 1

3

ここでの問題は、3 行目の MyUnitTests クラス内に Room オブジェクトを作成していることです。Ruby は、存在しない MyUnitTest::Room というクラスを使用したいと考えています。次のように、絶対クラス参照を使用する必要があります。

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 の前の :: に注目してください。これは、最上位の名前空間から Room オブジェクトを作成することを Ruby に伝えます:)

それがあなたの質問に答えることを願っています。

編集: Room クラスへの他の参照も ::Room に変更する必要があります。すみません、インデントのせいで一番上のものだけが問題だと思っていました。よく見ると、残りの部分にも :: が必要であることがわかります。

于 2012-04-30T17:58:25.733 に答える