深入探索

单元测试时可用的断言

  1. assert(boolean, message=nil)

断言 boolean 不是 false 或 nil。

  1. assert_block(message="assert_block failed.") {|| ...}

所有其它断言所依据的断言。如果块产生 true 则通过。

  1. assert_equal(expected, actual, message=nil)

如果 expected == +actual 为 true,则通过。

  1. assert_in_delta(expected_float, actual_float, delta, message="")

如果 expected_float 和 actual_float 在增量公差内相等,则通过。

  1. assert_instance_of(klass, object, message="")

如果 object .instance_of? klass 为 true,则通过。

  1. assert_kind_of(klass, object, message="")

如果 object .kind_of? klass 为 true,则通过。

  1. assert_match(pattern, string, message="")

如果 string =~ pattern,则通过。

  1. assert_nil(object, message="")

如果 object 为 nil,则通过。

  1. assert_no_match(regexp, string, message="")

如果 regexp !~ string,则通过。

  1. assert_not_equal(expected, actual, message="")

如果 expected != actual,则通过。

  1. assert_not_nil(object, message="")

如果 !object .nil?,则通过。

  1. assert_not_same(expected, actual, message="")

如果 !actual .equal? expected,则通过。

  1. assert_nothing_raised(*args) {|| ...}

如果块没有抛出异常,则通过。

  1. assert_nothing_thrown(message="", &proc)

如果块不抛出任何东西,则通过。

  1. assert_operator(object1, operator, object2, message="")

用 operator 比较 object1 与 object2。如果 object1.send(operator, object2) 为 true,则通过。

  1. assert_raise(*args) {|| ...}

如果块抛出给定的异常之一,则通过。

  1. assert_raises(*args, &block)

assert_raise 的别名。(在 Ruby 1.9 版本中弃用,在 2.0 版本中移除)。

  1. assert_respond_to(object, method, message="")

如果 object.respond_to? method 为 true,则通过。

  1. assert_same(expected, actual, message="")

如果 actual.equal? expected 为 true,则通过。(例如它们是同一个实例)。

  1. assert_send(send_array, message="")

如果方法 send 返回 true 值,则通过。

  1. assert_throws(expected_symbol, message="", &proc)

如果块抛出 expected_symbol,则通过。

  1. build_message(head, template=nil, *arguments)

构建失败消息。在模板之前添加 head,并且用参数将模板中的 ‘?’ 位置替换。

  1. flunk(message="Flunked")

flunk 总是失败。

换行很重要

我之前说过,在交互式 Ruby 控制台(IRB)中输入换行符时需要注意,因为换行符的位置可能会改变 Ruby 代码的含义。例如,这个:

linebreaks.rb
  1. x = ( 10 +
  2. ( 2 * 4 ) )

…将 18 分配给 x,但是这个:

  1. x = (10
  2. + (2*4))

…将 8 指定给了 x

这不是 IRB 的一个问题。这是 Ruby 代码的正常行为,即使在文本编辑器中并由 Ruby 解释器执行时也是如此。上面显示的第二个例子计算 10,发现它是一个完全可以接受的值,并迅速遗忘它;然后它计算 + (2*4),它也发现它是一个可接受的值(8),但它与前一个值(10)没有连接,因此返回 8 并分配给 x

如果你想告诉 Ruby 来计算分割成多行的表达式并将其“联系在一起”(tie lines together),忽略换行符,你可以使用行连续符 \。这就是我在这里所做的:

  1. x = (10 \
  2. + (2*4) )

这次,x 被赋值为 18

图形化调试器

对于正式的调试,我强烈建议使用图形化调试器(graphical debugger)。例如,Ruby In Steel IDE 中的调试器允许你通过单击编辑器的边沿来设置断点和监视点。它允许你在单独的停靠窗口中监视所选“监视变量”(watch variables)或所有局部变量的值。它保留当前执行点所有方法调用的“调用栈”(callstack),并允许你通过调用栈“向后”导航以查看变量的变化值。它还具有完整的“向下钻取”变量扩展,允许您扩展数组和散列并查看“内部”复杂对象。它还可以完整的“向下探查”(drill-down)以展开变量,允许你扩展数组和散列并查看“内部”复杂对象。这些功能远远超出了标准 Ruby 调试器的功能。

深入探索 - 图1

The Ruby In Steel debugger