深入探索
单元测试时可用的断言
assert(boolean, message=nil)
断言 boolean 不是 false 或 nil。
assert_block(message="assert_block failed.") {|| ...}
所有其它断言所依据的断言。如果块产生 true 则通过。
assert_equal(expected, actual, message=nil)
如果 expected == +actual 为 true,则通过。
assert_in_delta(expected_float, actual_float, delta, message="")
如果 expected_float 和 actual_float 在增量公差内相等,则通过。
assert_instance_of(klass, object, message="")
如果 object .instance_of? klass
为 true,则通过。
assert_kind_of(klass, object, message="")
如果 object .kind_of? klass
为 true,则通过。
assert_match(pattern, string, message="")
如果 string =~ pattern,则通过。
assert_nil(object, message="")
如果 object 为 nil,则通过。
assert_no_match(regexp, string, message="")
如果 regexp !~ string,则通过。
assert_not_equal(expected, actual, message="")
如果 expected != actual,则通过。
assert_not_nil(object, message="")
如果 !object .nil?,则通过。
assert_not_same(expected, actual, message="")
如果 !actual .equal? expected,则通过。
assert_nothing_raised(*args) {|| ...}
如果块没有抛出异常,则通过。
assert_nothing_thrown(message="", &proc)
如果块不抛出任何东西,则通过。
assert_operator(object1, operator, object2, message="")
用 operator 比较 object1 与 object2。如果 object1.send(operator, object2) 为 true,则通过。
assert_raise(*args) {|| ...}
如果块抛出给定的异常之一,则通过。
assert_raises(*args, &block)
assert_raise
的别名。(在 Ruby 1.9 版本中弃用,在 2.0 版本中移除)。
assert_respond_to(object, method, message="")
如果 object.respond_to? method 为 true,则通过。
assert_same(expected, actual, message="")
如果 actual.equal? expected 为 true,则通过。(例如它们是同一个实例)。
assert_send(send_array, message="")
如果方法 send 返回 true 值,则通过。
assert_throws(expected_symbol, message="", &proc)
如果块抛出 expected_symbol,则通过。
build_message(head, template=nil, *arguments)
构建失败消息。在模板之前添加 head,并且用参数将模板中的 ‘?’ 位置替换。
flunk(message="Flunked")
flunk
总是失败。
换行很重要
我之前说过,在交互式 Ruby 控制台(IRB)中输入换行符时需要注意,因为换行符的位置可能会改变 Ruby 代码的含义。例如,这个:
x = ( 10 +
( 2 * 4 ) )
…将 18
分配给 x
,但是这个:
x = (10
+ (2*4))
…将 8
指定给了 x
。
这不是 IRB 的一个问题。这是 Ruby 代码的正常行为,即使在文本编辑器中并由 Ruby 解释器执行时也是如此。上面显示的第二个例子计算 10
,发现它是一个完全可以接受的值,并迅速遗忘它;然后它计算 + (2*4)
,它也发现它是一个可接受的值(8
),但它与前一个值(10
)没有连接,因此返回 8
并分配给 x
。
如果你想告诉 Ruby 来计算分割成多行的表达式并将其“联系在一起”(tie lines together),忽略换行符,你可以使用行连续符 \
。这就是我在这里所做的:
x = (10 \
+ (2*4) )
这次,x
被赋值为 18
。
图形化调试器
对于正式的调试,我强烈建议使用图形化调试器(graphical debugger)。例如,Ruby In Steel IDE 中的调试器允许你通过单击编辑器的边沿来设置断点和监视点。它允许你在单独的停靠窗口中监视所选“监视变量”(watch variables)或所有局部变量的值。它保留当前执行点所有方法调用的“调用栈”(callstack),并允许你通过调用栈“向后”导航以查看变量的变化值。它还具有完整的“向下钻取”变量扩展,允许您扩展数组和散列并查看“内部”复杂对象。它还可以完整的“向下探查”(drill-down)以展开变量,允许你扩展数组和散列并查看“内部”复杂对象。这些功能远远超出了标准 Ruby 调试器的功能。
The Ruby In Steel debugger