0

我正在使用 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总是零个或多个 Enumerator 对象):

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.inspect),当我运行测试时会返回:

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相同,如上面的代码所示。那么如何将异常中的消息字符串转换为通过测试呢?还是我做错了什么?非常感谢!

注意:测试必须期待一个对象,而不是一个字符串。我无法更改测试。

4

1 回答 1

1

您可以覆盖异常类的行为:

  class UnorderedEnumerator < RuntimeError
    def initialize(message)
      @message = message
    end

    def message
      @message
    end
  end
于 2013-07-24T19:41:33.173 回答