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は常に 0 個以上の 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