変わった特異メソッドの定義の仕方 with yield

  • 4
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

rspec-rails をなんとなく読んでいた時に見つけて「なるほど」と驚いたので.

今までの自分の考え方だったら instance_eval + define_method でやっていただろうけど, こっちのほうが綺麗ダナーと.

subject.yield_sub do |sub|
  def sub.foo
    'foo'
  end

  "...do something"
end

見つけたのは このファイルで

全体の挙動はこんなかんじです.

require 'rspec'

class Foo
  class Sub; end

  attr_reader :sub

  def initialize
    @sub = Sub.new
  end

  def yield_sub
    yield @sub
  end
end

describe "Definition with yield" do
  subject { Foo.new }

  context "when not defined" do
    its(:sub) { should_not respond_to(:foo) }
  end

  context "when defined in block" do
    before do
      subject.yield_sub do |sub|
        def sub.foo
          'foo'
        end
      end
    end

    its(:sub) { should respond_to(:foo) }
  end

  context "after" do
    its(:sub) { should_not respond_to(:foo) }
  end
end