我使用的是Ruby 1.9.3。我正在努力通过以下测试,但我无法更改:
def test_raising_unordered_enumerator_should_reference_enumerator
decending_enumerator = 10.downto(1)
enumerator = CombinedOrderedEnumerator.new(decending_enumerator)
begin
enumerator.take(2)
assert false
rescue CombinedOrderedEnumerator::UnorderedEnumerator => exception
assert_equal decending_enumerator, exception.message
end
end
我已经编写了以下代码(参数*args总是零个或多个枚举器对象):
class CombinedOrderedEnumerator < Enumerator
class UnorderedEnumerator < RuntimeError; end
def initialize(*args)
super() do |yielder|
values = []
args.each do |arg|
raise CombinedOrderedEnumerator::UnorderedEnumerator, arg unless arg.each_cons(2).all? { |a, b| (a <=> b) <= 0 }
arg.each { |x| values.push x }
end
values.sort.each { |v| yielder.yield v }
end
end
end
当我运行测试时,它失败了,并显示以下消息:
1) Failure:
test_raising_unordered_enumerator_should_reference_enumerator(CombinedOrderedEnumeratorTest) [combined_enumerator_test.rb:102]:
Expected: #<Enumerator: 10:downto(1)>
Actual: "#<Enumerator:0x007ffae1846d20>"
如果我在测试中检查消息字符串(arg.envest),当我运行测试时会返回:
1) Failure:
test_raising_unordered_enumerator_should_reference_enumerator(CombinedOrderedEnumeratorTest) [combined_enumerator_test.rb:102]:
Expected: #<Enumerator: 10:downto(1)>
Actual: "#<Enumerator: 10:downto(1)>"
最后,如果我尝试使用arg.to_enum将消息字符串转换为枚举器,我会得到与仅使用arg相同的结果,如上面的代码所示。那么,如何转换异常中的消息字符串以通过测试呢?还是我做错了什么?非常感谢!
注意:测试必须是一个对象,而不是字符串。我无法更改测试。
您可以覆盖异常类的行为:
class UnorderedEnumerator < RuntimeError
def initialize(message)
@message = message
end
def message
@message
end
end