一旦你有了这个文件,修改你的 unit test 框架变成这样:


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

class MyUnitTests  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
 
  这个文件 require 了你在lib/ex47.rb 里建立的 Room这个类,接下来我们要做的是测试它。于是我们看到一系列的以 test_ 开头的测试方法,它们是所谓的「Test Case」,每一个Test Case里面都有一小段代码,它们会建立一个或者一些房间,然后去确认房间的功能和你期望的是否一样。它测试了基本的房间功能,然后测试了路径,后测试了整个地图。

  这里重要的方法是 assert_equal,它保证了你设置的变量,以及你在Room 里设置的路径和你的期望相符。如果你得到错误的结果的话,Ruby 的 Test::Unit 模块将会印出一个错误信息,这样你可以找到出错的地方并且修正过来。

  测试指南

  在写测试代码时,你可以照着下面这些不是很严格的指南来做:

  1、测试脚本要放到 tests/目录下,并且命名为test_NAME.rb这样做还有一个好处是防止测试代码和别的代码互相混掉。

  2、为你的每一个模块写一个测试。

  3、Test Cast 方法保持简短,但如果看上去不怎么整洁也没关系,Test Cast一般都有点乱。

  4、算Test Cast有些乱,也要试着让他们保持整洁,把里边重复的代码删掉。建立一些辅助方法来避免重复的代码。当你下次在改完代码需要改测试的时候,你会感谢我这一条建议的。重复的代码会让修改测试变得很难操作。

  5、后一条是别太把测试当做一回事。有时候,更好的方法是把代码和测试全部删掉,然后重新设计代码。

  你应该看到的结果


$ ruby test_ex47.rb
Loaded suite test_ex47
Started
...
Finished in 0.000353 seconds.

3 tests, 7 assertions, 0 failures, 0 errors, 0 skips

Test run options: --seed 63537
 


  程序正确,测试代码运行结果如上,试着将程序改错,运行测试代码看看结果会是什么样子。

  加分练习

  1、仔细阅读Test::Unit相关的文件,再去了解一下其他的替代方案。

  2、了解一下 Rspec,看看它是否可以干得更出色。

  3、改进你游戏里的 Room,然后用它重建你的游戏。这次重写,你需要一边写代码,一般把单元测试写出来。