RSpecでpower_assertを使うためのrspec-power_assertを作ってみた

Rubykaigi 2014でも発表されていたpower_assertをRSpecでも使いたい、というわけで色々試してみて、それっぽいシンタックスを考えてみたので一応gemにしてみました。

[joker1007/rspec-power_assert](https://github.com/joker1007/rspec-power_assert "joker1007/rspec-power_assert")

この名前取っちゃっていいものかと悩んだんですが、まあ早いもの勝ちということで…。

power_assertのv0.1.3以前だと`let`や`subject`の値が取れないという問題があったんですが、0.1.4以降だと修正されていてちゃんと取得できるようになっています。
(取れないなーとツイートして寝たら、作者のk_tsjさんから修正したバージョンあるからリリースしておいたよ、と教えてもらいました。感謝！)

RSpecっぽいシンタックスとRSpecのテストレポートを表示した時に、できるだけ不自然にならないように表示を工夫する、ぐらいのことはしてます。

本当はマッチャっぽく書けないかと色々実験したんですが、どうもマッチング処理の呼び出しにワンクッション入るせいかちゃんと値が取れなくなったり、逆にややこしい形になってしまったので、あんまり無理しない感じにしました。
より良い書き方を思い付いた人は、突っ込みください。

ちなみに、私は昨日の夜に頑張ってたんですが、ukstudioさんが既にブログ書いてたらしい……。
[RSpecでPower Assertをやるには](http://ukstudio.jp/2014/09/21/rspec_power_assert/ "RSpecでPower Assertをやるには")

## サンプルspec
```rb
describe Array do
  describe "#map" do
    let(:array) { [1, 2, 3] }
    subject { %w(a b c) }

    before do
      @array = [1, 2, 3]
    end

    it do
      is_asserted_by { subject.map(&:upcase) == array }
    end

    it do
      upcased = subject.map(&:upcase)
      upcased.pop
      is_asserted_by { upcased == @array }
    end

    it do
      is_expected.to eq %w(a b c)
      is_asserted_by { subject.map(&:upcase) == %w(A B C) }
    end

    it "should transform array" do
      is_expected.to eq %w(a b c)
      is_asserted_by { subject.map(&:upcase) == %w(A B C) }
    end
  end
end
```

```
Rspec::PowerAssert
  Array
    #map
      example at ./spec/rspec/power_assert_spec.rb:13 (FAILED - 1)
      example at ./spec/rspec/power_assert_spec.rb:17 (FAILED - 2)
      is_asserted_by { subject.map(&:upcase) == %w(A B C) }
                         |       |             |
                         |       |             true
                         |       ["A", "B", "C"]
                         ["a", "b", "c"]
      should transform array

Failures:

  1) Rspec::PowerAssert Array#map
     Failure/Error: is_asserted_by { subject.map(&:upcase) == array }
               is_asserted_by { subject.map(&:upcase) == array }
                                |       |             |  |
                                |       |             |  [1, 2, 3]
                                |       |             false
                                |       ["A", "B", "C"]
                                ["a", "b", "c"]
     # ./lib/rspec/power_assert.rb:19:in `is_asserted_by'
     # ./spec/rspec/power_assert_spec.rb:14:in `block (4 levels) in <top (required)>'

  2) Rspec::PowerAssert Array#map
     Failure/Error: is_asserted_by { upcased == @array }
               is_asserted_by { upcased == @array }
                                |       |  |
                                |       |  [1, 2, 3]
                                |       false
                                ["A", "B"]
     # ./lib/rspec/power_assert.rb:19:in `is_asserted_by'
     # ./spec/rspec/power_assert_spec.rb:20:in `block (4 levels) in <top (required)>'

Finished in 0.00455 seconds (files took 0.10298 seconds to load)
4 examples, 2 failures

Failed examples:

rspec ./spec/rspec/power_assert_spec.rb:13 # Rspec::PowerAssert Array#map
rspec ./spec/rspec/power_assert_spec.rb:17 # Rspec::PowerAssert Array#map

```