【问题标题】:Rspec: Should be (this or that)Rspec:应该是(这个或那个)
【发布时间】:2011-10-27 21:00:36
【问题描述】:

在两个(或更多)结果中的任何一个都可以接受的情况下,编写 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(option1,option2)”,但这似乎有点多 - 我希望有更好的解决方案。

【问题讨论】:

    标签: ruby rspec


    【解决方案1】:

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

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

    或者使用新的 Rspec 3 语法:

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

    【讨论】:

    • 这在最新版本中对我不起作用,我必须先把它变成一个数组be_in(["heads", "tails"])
    • 感谢您的反馈
    • 次要更正:ActiveSupport 在Object 上定义#in?,而不是在Array 上,因为它被称为flip_coin.in? %w(heads tails),并且flip_coin 可以是任何Object
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我可能会这样写:

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

      【讨论】:

      • 一个不错的选择,但它似乎颠覆了正确的“rspec”做事方式,期望值在右边。
      【解决方案4】:

      另一种写法,期望在应该的右边:

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

      【讨论】:

        【解决方案5】:

        如果应用 orbe 匹配器

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

        【讨论】:

        • 我发现这比 15 年 12 月使用“或”的答案更不直观。
        【解决方案6】:

        你可以通过flipping比较来解决这个问题:

        expect(['head','tails']).to include(flip_coin)

        【讨论】:

          猜你喜欢
          • 2023-03-23
          • 2019-03-22
          • 1970-01-01
          • 1970-01-01
          • 2021-10-07
          • 2021-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多