stub_constで少しハマった話

具体的には以下のコードを書くのに、おや?となっていた。Errno は環境依存の話になる (ので stub_const している) 、いちおう手元の MacOS X 10.9 (古い!) での話となる。

    it 'accepts rescuing multiple same error code exceptions' do
      # System dependent error code depends on runtime environment.
      stub_const('Errno::EAGAIN::Errno', 35)
      stub_const('Errno::EWOULDBLOCK::Errno', 35)

      expect_no_offenses(<<-RUBY.strip_indent)
        begin
          something
        rescue Errno::EAGAIN, Errno::EWOULDBLOCK
          handle_exception
        end
      RUBY
    end

github.com

例えば以下のように Errno::EAGAIN::Errno の値のみ 34 にしようしたら、Errno::EWOULDBLOCK::Errno まで 34 になる。

stub_const('Errno::EAGAIN::Errno', 34)

stub_const の使い方を間違っていたかなと、しばし逡巡してログを仕込んだりでもしやと思ったら以下が理由だった。

> Errno::EAGAIN.object_id == Errno::EWOULDBLOCK.object_id
=> true

もっと書くとこう。

> Errno::EWOULDBLOCK
=> Errno::EAGAIN

なるほどなあ。