RSpec shared_examples

shared_examples あまり使ったことがなかったが、
学習教材作成用に記述していると, 初めて shared_examplesを 使いたくなったので使ってみた。

shared_examples "期待通りレンダリングされる" do
  let(:expected) {
    <<-HTML
    <dt>name</dt><dd>myname</dd>
    <dt>email</dt><dd>myname@example.com</dd>
    <dt>age</dt><dd>33</dd>
    <dt>address</dt><dd>myaddress</dd>
    HTML
  }

  it { should include("<dt>name</dt><dd>myname</dd>") }
  it { should include("<dt>email</dt><dd>myname@example.com</dd>") }
  it { should include("<dt>age</dt><dd>33</dd>") }
  it { should include("<dt>address</dt><dd>myaddress</dd>") }
end

describe "renderを名前付き引数(ハッシュ)で" do
  def render(args)
    <<-HTML
    <dt>name</dt><dd>#{args[:name]}</dd>
    <dt>email</dt><dd>#{args[:email]}</dd>
    <dt>age</dt><dd>#{args[:age]}</dd>
    <dt>address</dt><dd>#{args[:address]}</dd>
    HTML
  end

  subject { render(name: "myname", email: "myname@example.com", age: 33, address: "myaddress") }
  it_behaves_like "期待通りレンダリングされる"
end

describe "renderを配列引数で" do
  def render(*args)
    <<-HTML
    <dt>name</dt><dd>#{args[0]}</dd>
    <dt>email</dt><dd>#{args[1]}</dd>
    <dt>age</dt><dd>#{args[2]}</dd>
    <dt>address</dt><dd>#{args[3]}</dd>
    HTML
  end

  subject { render("myname", "myname@example.com", 33, "myaddress") }
  it_behaves_like "期待通りレンダリングされる"
end

describe "renderを通常の引数で実現" do
  def render(name, email, age, address)
    <<-HTML
    <dt>name</dt><dd>#{name}</dd>
    <dt>email</dt><dd>#{email}</dd>
    <dt>age</dt><dd>#{age}</dd>
    <dt>address</dt><dd>#{address}</dd>
    HTML
  end

  subject { render("myname", "myname@example.com", 33, "myaddress") }
  it_behaves_like "期待通りレンダリングされる"
end

0. 個別の describe で 重複
1. 共通の letを shared_context に移動
2. subjectの導出
3. 重複した it を shared_exmaples に移動(shared_contextをshared_exampleに)

のように Spec Code をこねくり回していた。

shared_examples 内で Exercise(subject) を脇に置いといて、Verifyを強調して記述することも可能で、面白いなと思った。

その他で考えていたこと

エラーが出た際に(全体ではなく)どの部分の文字出力で落ちたかを一目で分かるようにエラーレポートを出すようにしつつ、
テスト記述の it should... 記述を簡潔に書くにはどうするのがいいのか考えていると、カスタムマッチャーを使うのが妥当なのか、 今のように、shared_examples で 細かく it should を書くのが良いのか わからなくなった。