【问题标题】:Looking for a rspec matcher that checks a value to be included in array寻找一个 rspec 匹配器来检查要包含在数组中的值
【发布时间】:2017-05-08 09:36:09
【问题描述】:

我该怎么写:

给定一个数组b = ['one', 'two', 'three']

我希望 a 的值是 包含在数组b中。

我想将它与 all 匹配器一起使用,所以我的最终代码如下所示:

b = ['one', 'two', 'three']
my_list = [ {'type' => 'one'}, {'type' => 'two'}, {'type' => 'three'} ]
expect(my_list).to all(include("type" => a_value_included_in(b))

正在测试的内容:

来自my_list 的所有哈希必须有一个type 键,其值在数组b 中。

Rspec 中是否有这样的内置匹配器?

除了使用明显的反向:expect([1, 2, 3]).to include(value),在我的示例中,这不是真正适合的,您如何检查数组中包含的值?

【问题讨论】:

    标签: ruby-on-rails ruby rspec


    【解决方案1】:

    如果您想检查来自b每个 字符串是否存在于来自my_list 的任何散列中:

    b = ['one', 'two', 'three']
    my_list = [ {'type' => 'one'}, {'type' => 'two'}, {'type' => 'three'} ]
    b.each do |str|
      expect(my_list.find { |h| h['type'] == str }).to be_present
    end
    

    或者,您可以选择:

    expect(my_list.map { |h| h['type'] }.sort) to eq(b.sort)
    

    所以当有人添加 my_list << { 'type' => 'not_in_list' } 时 会失败。

    expect(my_list.map { |h| b.include?(h['type']) }.uniq).to eq(true)
    

    【讨论】:

    • 我的用例是测试 my_list 中的所有散列必须有一个 type 键,其值在数组 b 中。我认为您的建议听起来像是在测试其他东西。
    • @Cristian 这是不可能的,因为 hash 只能包含 uniq 键,所以从技术上讲,在给定键上不可能有一个超过单个值的散列。如果你想检查来自my_list 的所有哈希是否包含type 键并且它的值是一个数组,你可以这样做:expect(my_list.all? { |h| h['type'].sort == b.sort }).to eq(true)
    • 不,键 type 处的值始终是一个字符串,我想确保这些字符串位于预定义的数组中(有点像 enum 的工作方式)。因此,当有人添加 my_list << { 'type' => 'not_in_list' } 时,规范将失败。
    • @Cristian 哦,这很简单,只需将my_lists 的哈希值映射到type 并检查b 是否始终包含此值。编辑了答案
    • 好吧,我想这是唯一的方法。我希望能够使用匹配器来获得更好的语法。我可以将最后一个解决方案更改为:expect(my_list.all? { |h| b.include?(h['type']) }).to be(true)(更干净一点)
    【解决方案2】:

    在你的情况下,我会简单地使用(元素的顺序无关紧要):

    expect(my_list).to match_array(b.map{|v| { 'type' =>  v })
    

    如果b 可以被接受为my_list 的子集,则使用include 匹配器而不是match_array

    我不认为这种情况的特殊匹配器存在和/或确实需要它。不过,如果你真的不能离开它,你可以创建一个自定义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2013-03-27
      相关资源
      最近更新 更多