【问题标题】:RSpec: How to test for a boolean return type?RSpec:如何测试布尔返回类型?
【发布时间】:2012-11-14 01:09:54
【问题描述】:

我正在使用 RSpec 来测试 API。我想指定一个特定的端点返回一个布尔值,truefalse。这是一个供其他系统和语言使用的 API,因此它是一个实际的布尔值很重要,而不仅仅是 Ruby 将评估为 falsetrue 的东西。

但我看不到这样做的方法,因为 Ruby 中没有 Boolean 类型。

【问题讨论】:

  • API 是否返回字符串? JSON?似乎您应该测试 API 使用者将看到的相同内容,例如“真”是真的。

标签: rspec boolean


【解决方案1】:
expect(variable).to be_in([true, false])

【讨论】:

  • 这里对我的问题有很多很好的答案。就个人而言,我最喜欢这个,因为它简单明了。
  • 在这里不起作用:expected true to respond to 'in?'
  • @brauliobo 你需要rails(或者至少是积极的支持)
【解决方案2】:

我遇到了同样的问题。这是我想出的:

RSpec::Matchers.define :be_boolean do
  match do |actual|
    expect(actual).to be_in([true, false])
  end
end

见:https://www.relishapp.com/rspec/rspec-expectations/v/3-4/docs/custom-matchers

可以这样使用:

it 'is boolean' do
  expect(true).to be_boolean
end

【讨论】:

  • 赞成为遵循 RSpec 约定的 OP 定义通用、高度可重用的解决方案。我个人唯一要改变的是使用@tomasz 的be_in([true, false]) 条件而不是satisfy 块,因为它非常简洁明了。
  • 好主意!完成。
【解决方案3】:

在最近的 rspec 版本中,可以使用复合匹配器:

expect(thing).to be(true).or be(false)

【讨论】:

【解决方案4】:

以上的组合怎么样?

RSpec::Matchers.define :be_boolean do
  match do |value|
    [true, false].include? value
  end
end

用法:

expect(something).to be_boolean

【讨论】:

    【解决方案5】:

    虽然 Ruby 没有 Boolean 类,但它确实有 TrueClassFalseClass,其中 truefalse 是唯一的实例。我相信您可以针对这两者中的任何一个进行测试并且一切顺利。

    true.is_a? TrueClass # => true
    (1 == 1).is_a? TrueClass # => true
    1.is_a? TrueClass # => false
    
    false.is_a? FalseClass # => true
    (1 == 2).is_a? FalseClass # => true
    nil.is_a? FalseClass # => false
    

    【讨论】:

    • 包含两者的完整规范是什么样的?
    • 这没什么特别的,只需从您的 API 中获取结果并执行以下操作:[TrueClass, FalseClass].should include(result.class) 甚至 (result.is_a? TrueClass || result.is_a? FalseClass).should be_true
    • [TrueClass, FalseClass].should include(result.class) 甚至 (result.is_a?TrueClass || result.is_a?FalseClass).should be_true 在 rspec2 中有语法错误并且不工作。
    【解决方案6】:

    很久以后,但这是我决定的:

    foo.should satisfy {|x| [true, false].map(&:object_id).include? x.object_id}
    

    这是有效的,因为 true 和 false 只有一个实例。此外,更多的是好奇,但它们也总是具有相同的实例 ID。

    【讨论】:

      【解决方案7】:

      将 gem rspec_boolean 添加到组中的 Gemfile :development, :test:

      gem 'rspec_boolean'

      而不是像这样使用它:

      expect(val.is_done).to be_boolean

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-29
        • 1970-01-01
        • 1970-01-01
        • 2016-09-07
        • 1970-01-01
        • 1970-01-01
        • 2015-04-08
        • 1970-01-01
        相关资源
        最近更新 更多