Rubykaigi 2014でも発表されていたpower_assertをRSpecでも使いたい、というわけで色々試してみて、それっぽいシンタックスを考えてみたので一応gemにしてみました。
この名前取っちゃっていいものかと悩んだんですが、まあ早いもの勝ちということで…。
power_assertのv0.1.3以前だとlet
やsubject
の値が取れないという問題があったんですが、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