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

Gly*_*yph 32 ruby rspec

在两个(或更多)结果中的任何一个都可以接受的情况下编写rspec的最佳方法是什么?

这是我想要做的一个例子.这显然是错误的(我认为),但它应该给你我想要完成的事情的要点:

it "should be heads or tails" do
  h="heads"
  t="tails"
  flip_coin.should be(h || t)
end
Run Code Online (Sandbox Code Playgroud)

是的,我知道我可以编写自己的rspec匹配器"should_be_one_or_the_other(option1,option2)",但这似乎有点多 - 我希望有更好的解决方案.

Ser*_*pov 33

ActiveSupport提供Object#in?方法.您可以将它与RSpec结合使用,只需使用以下内容:

flip_coin.should be_in(["heads", "tails"])
Run Code Online (Sandbox Code Playgroud)

或者使用新的Rspec 3语法:

expect(flip_coin).to be_in(["heads", "tails"])
Run Code Online (Sandbox Code Playgroud)


Cam*_*way 23

我知道这已经过时了但我在RSpec 3.4上遇到了这个问题,现在有一个or关键字.所以这是有效的:

expect(flip_coin).to eq('heads').or(eq('tails'))
Run Code Online (Sandbox Code Playgroud)


Tum*_*mas 14

我可能会写这样的东西:

it "should be heads or tails" do
  ["heads", "tails"].should include flip_coin
end
Run Code Online (Sandbox Code Playgroud)

  • 一个不错的选择,但它似乎颠覆了正确的"rspec"做事方式,右边的预期值. (5认同)

wee*_*HIS 11

编写它的另一种方式是对权利的期望:

it 'should be heads or tails' do
  flip_coin.should satisfy{|s| ['heads', 'tails'].include?(s)}
end
Run Code Online (Sandbox Code Playgroud)