LoginSignup
36
33

More than 5 years have passed since last update.

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

Posted at

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

joker1007/rspec-power_assert

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

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

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

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

ちなみに、私は昨日の夜に頑張ってたんですが、ukstudioさんが既にブログ書いてたらしい……。
RSpecでPower Assertをやるには

サンプルspec

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

36
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
33