ruby Rspec:应该是(这个或那个)

uqdfh47h  于 2022-12-03  发布在  Ruby
关注(0)|答案(6)|浏览(188)

在两个(或更多)结果中的任何一个都是可接受的情况下,编写rspec的最佳方式是什么?
下面是我想做的一个例子。这显然是错误的(我认为),但它应该给予你我试图完成的要点:

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

是的,我知道我可以编写我自己的rspec匹配器“should_be_one_or_the_other(option 1,option 2)",但这似乎有点过分-我希望有一个更好的解决方案。

tsm1rwdh

tsm1rwdh1#

ActiveSupport提供了Object#in?方法,你可以将它与RSpec结合起来,简单的使用如下:

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

或者使用新的Rspec 3语法:

expect(flip_coin).to be_in(["heads", "tails"])
ldxq2e6h

ldxq2e6h2#

我知道这是旧的,但是在我在RSpec 3.4中遇到了这个,现在有一个or方法。所以这是有效的:

expect(flip_coin).to eq('heads').or(eq('tails'))
svdrlsy4

svdrlsy43#

我可能会这样写:

it "should be heads or tails" do
  ["heads", "tails"].should include flip_coin
end
vmjh9lq9

vmjh9lq94#

另一种写法是把期望放在应该的右边:

it 'should be heads or tails' do
  flip_coin.should satisfy{|s| ['heads', 'tails'].include?(s)}
end
ycl3bljg

ycl3bljg5#

如果使用be匹配器应用or

expect(flip_coin).to eq('heads').or(be == 'tails')
mgdq6dx1

mgdq6dx16#

你可以通过flipping的比较来解决这个问题:
expect(['head','tails']).to include(flip_coin)

相关问题