使用rspec对数组响应进行存根

时间:2014-07-02 14:59:37

标签: ruby-on-rails ruby rspec stubbing

我目前正致力于规范使用google_drive gem填充数据库的rake任务。 gem允许用户访问电子表格ws,如下所示:

# Gets content of A2 cell.
p ws[2, 1]  #==> "hoge"

我尝试使用规范的功能如下所示:

def get_tags(ws, row)
  tags = []
  [1, 21, 22, 23, 26, 29, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40].each do |col|
    tags << ws[row, col] unless ws[row, col].blank?
  end
  tags
end

相当自我解释,它会传递一行,然后将列数据添加到数组中指定的每列的tags

我的ws数组由以下内容组成:

ws = [[nil, 'Good', 'Tultex', '0241', 'Men\s Blend Tee',
            'XS - 3XL', '$3.40', '$4.50', '$4.50', '--', '--', '--',
            'TSC', 'y', 'Adult Unisex', 'Tee Shirt', 'Short Sleeve',
            'Crewneck', '3.2', 'Cotton/Poly (35/36)', 'Fitted', '11',
            '0240 (ladies)', '', 'Std Fitted Crew', 'Tees and Tanks',
            'Nicer - Fashion Fitted', 'Blend', '', '', '', 'Fashionable',
            '', '', '']]

因此,我需要get_tags才能返回此内容:

resultant = ['Good', 'Tee Shirt', 'Short Sleeve', 'Crew Neck',
             'Standard', '', 'Tees and Tanks', 'Least Expensive',
             'Regular Cotton', '', '', '', '', '', '', 'Least Expensive']

我的问题是我不知道如何指定一个数组来接受ws所做的索引类型(ws[val, val]),因为它通常是一个范围索引。我尝试创建一个二维数组但显然没有用。还尝试通过以下方式将其删除:

allow(ws).to receive(:[]) do |arg1, arg2|
  ws[arg1][arg2]
end

这创建了一个无限循环的粗俗,所以我尝试将ws存储到另一个名为temp的数组中并执行此操作(几乎相同的事情):

allow(ws).to receive(:[]) do |arg1, arg2|
  temp[arg1][arg2]
end

但我仍然以相同的无限短截循环结束。 关于下一步采取什么步骤的任何建议将不胜感激!在此先感谢:)

2 个答案:

答案 0 :(得分:1)

如何创建一个处理所需接口的类:

class DBStub
  def initialize(data_store)
    @data_store = data_store
  end

  def [](arg1, arg2)
    @data_store[arg1][arg2]
  end
end

ws = DBStub.new(temp)

答案 1 :(得分:0)

您期望在ws中有什么价值?如果您不关心价值观是什么,只是想测试一下,他们可以做的就是

   allow(ws).to receive(:[]) { rand(1000) }