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 を書くのが良いのか わからなくなった。