RSpec的。测试块调用的参数

时间:2014-08-20 10:12:10

标签: ruby-on-rails ruby ruby-on-rails-4 rspec

我遇到了在rails项目中测试块调用参数的问题。

我大约有这段代码(简化):

DropboxApi.read_path do |batch|
    # some actions are here
end

批处理是数据的哈希值。

我有一个测试DropboxApi方法的rspec规范,我需要测试批量'的某些字段。我想得到这样的东西:

it { expect(batch).to respond_to(:data) }
it { expect(batch.data.count).to eq(6) }

我没有找到一些方法来做到这一点。在这种情况下,收益匹配器没有帮助,因为它们只检查块调用而不是它的参数。

有人可以帮助实现我想要的吗?我想我可能应该改变我的规范方法。但我还不知道如何。

2 个答案:

答案 0 :(得分:3)

实际上它非常直接。

it "responds to data" do
  DropboxApi.read_path do |batch|
    expect(batch).to respond_to(:data)
  end
end

it "has a count of 6" do 
  DropboxApi.read_path do |batch| 
    expect(batch.data.count).to eq(6)
  end
end

如果你真的希望它看起来更简洁,就像你的例子一样,你可以做到以下几点。

let(:batch) {
  DropboxApi.read_path do |batch|
    return batch
  end
 }

 it { expect(batch).to respond_to(:data) }
 it { expect(batch.data.count).to eq(6) }

答案 1 :(得分:0)

从你的问题来看并不明显,但如果你需要的是在调用DropboxApi.read_path时检查传递给块的参数,你可以简单地调用该API,并将传递给块的值保存到被检查:

let(:batch) {
  res = nil
  DropboxApi.read_path do |batch|
    res = batch
  end
  res
}

it { expect(batch).to respond_to(:data) }
it { expect(batch.data.count).to eq(6) }