Rspec:(これまたはそれ)

2つ(またはそれ以上)の結果のいずれかが受け入れられる状況でrspecを書く最良の方法は何でしょうか?

ここに私がしたいことの例があります。これは明らかに間違っている(私は思う)が、それはあなたに私が達成しようとしていることの要点を与えるはずです:

it "should be heads or tails" do
  h="heads"
  t="tails"
  flip_coin.should be(h || t)
end

そして、はい、私は私自身のrspecのmatcher "should_be_one_or_the_other(option1、option2)"を書くことができることを知っていますが、それはちょっとのようです - 私はよりよい解決を望んでいました。

26

5 答え

ActiveSupportは Object#in?メソッドを提供します。それをRSpecと組み合わせて、単に以下を使用することができます:

flip_coin.should be_in(["heads", "tails"])

または、新しいRspec 3構文を使用します。

expect(flip_coin).to be_in(["heads", "tails"])
28
追加された
マイナーな修正:ActiveSupportは array ではなく Object#in?を定義しています。 %w(head tails)で、flip_coinは任意の Object です。
追加された 著者 Dave Schweisguth,
フィードバックをお寄せいただきありがとうございます
追加された 著者 Sergey Potapov,
これは最新版ではうまくいきませんでした。最初に be_in(["heads"、 "tails"])
追加された 著者 Vox,

私はこれが古かったことを知っていますが、RSpec 3.4でこれに触れました。 またはキーワードを入力してください。これは有効です:

expect(flip_coin).to eq('heads').or(eq('tails'))
19
追加された

私はおそらくこのようなものを書くだろう:

it "should be heads or tails" do
  ["heads", "tails"].should include flip_coin
end
14
追加された
はい、間違った方法ではなく、間違いなく最もクリーンな構文
追加された 著者 idrinkpabst,
まともな選択肢ですが、それは正しい "rspec"方法を邪魔して、右の期待値を使っているようです。
追加された 著者 GlyphGryph,

それを右の期待通りに書く別の方法:

it 'should be heads or tails' do
  flip_coin.should satisfy{|s| ['heads', 'tails'].include?(s)}
end
11
追加された

be の正規表現でまたは

expect(flip_coin).to eq('heads').or(be == 'tails')
2
追加された
私はこれを、12月15日の "or"を使った答えよりも直感的ではないと感じます。
追加された 著者 Dave Newton,