我试图为简单的哈希编写测试但是哈希本身非常大。
对于较小的我可能会写一个类似的测试:
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
然而,对于一个很大的地方来说,做上述事情似乎很麻烦(即对于一个有二十个左右键值对的人),什么是写测试的最佳方法?
感谢您的帮助
答案 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
您可能决定创建多个测试,每个测试都会测试生成的哈希值的不同部分。
如果您的测试需要验证所有元素正好,那么您需要显式创建该哈希。您可能决定将其写入外部位置(如配置文件或常量),尤其是在多个测试中重复使用时。