【问题标题】:RSpec: testing large hashes in RSpecRSpec:在 RSpec 中测试大散列
【发布时间】:2015-06-02 10:18:44
【问题描述】:

我正在尝试为一个简单的散列编写一个测试,但是散列本身非常大。

对于较小的,我可能会写一个这样的测试:

describe Hash do
  it 'should display some kind if hash' do
    some_hash = { one: 1, two: 2, three: 3 }
    expect(subject.hash).to eq some_hash
  end
end

但是对于大型 has 而言,执行上述操作可能看起来很麻烦(即对于具有大约 20 个键值对的 has),编写测试的最佳方法是什么?

感谢您的帮助

【问题讨论】:

  • 没听懂.. 你能说出你所说的是什么意思吗?但是对于一个大公司来说,上面的操作可能看起来很麻烦

标签: ruby hash rspec


【解决方案1】:

根据您的哈希类型,您可以考虑使用固定装置:http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html

或者您可以将 .yml 文件存储在规范下的“支持”目录中,然后将哈希加载到如下变量中:

my_hash = YAML.load_file('path_to_yml.yml')

【讨论】:

    【解决方案2】:

    如果测试只关心生成的哈希中的某些值,则无需使用include 明确指出哈希中与测试无关的任何其他元素:

    describe Hash do
      it 'should display some kind if hash' do
        some_hash = { one: 1, two: 2, three: 3 }
        expect(subject.hash).to include some_hash
      end
    end
    

    您可能决定创建多个测试,每个测试结果哈希的不同部分。

    如果您的测试需要验证 所有 元素是否符合预期完全,则需要显式创建该哈希。您可能决定将其写入外部位置(如配置文件,或作为常量),尤其是在多个测试中重复使用时。

    【讨论】:

      【解决方案3】:

      如果您期望哈希包含 x 个键,但您不关心此阶段的值,那么您可以这样做:

      keys_array = [:a, :b, :c, ... :n]`
      expect(subject.hash.keys).to eq keys_array
      

      但是,如果你的班级是这样的:

      class Foo
        ...
      
        def to_h
          # call other methods and combine into a hash
        end
        ...
      
      end
      

      并且这些方法中的每一个都有大量的逻辑,那么你最好单独测试每个方法。

      或者,您可能只关心每个键返回一些值(而不是nil):

      expect(subject.hash.values).to_not include(nil)

      【讨论】:

        【解决方案4】:

        我认为有两种方法可以解决这个问题,一种方法是写出整个哈希并期望它等于,就像你在上面做的那样。第二种方法是期望哈希包含某个值。

        expect(subject.hash).to include(:one)
        

        您可能会从正在使用的类中的多个方法生成此哈希。最好测试用于创建哈希的方法。

        【讨论】:

          猜你喜欢
          • 2016-01-27
          • 1970-01-01
          • 2011-06-09
          • 2021-09-26
          • 1970-01-01
          • 1970-01-01
          • 2015-03-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多