RSpec:在RSpec中测试大型哈希值

时间:2015-03-29 11:36:22

标签: ruby hash rspec

我试图为简单的哈希编写测试但是哈希本身非常大。

对于较小的我可能会写一个类似的测试:

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

然而,对于一个很大的地方来说,做上述事情似乎很麻烦(即对于一个有二十个左右键值对的人),什么是写测试的最佳方法?

感谢您的帮助

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

如果您希望散列包含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)

答案 3 :(得分:0)

如果测试仅关注结果哈希中的某些值,则无需在哈希中明确指出任何其他元素,这些元素与使用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

您可能决定创建多个测试,每个测试都会测试生成的哈希值的不同部分。

如果您的测试需要验证所有元素正好,那么您需要显式创建该哈希。您可能决定将其写入外部位置(如配置文件或常量),尤其是在多个测试中重复使用时。