使用RSpec接收为Ruby struct动态创建的方法

时间:2015-07-15 15:05:30

标签: ruby struct rspec

我想知道如何使用RSpec来存储为Ruby结构动态创建的方法。

我的代码如下所示:

def test_method
  queue.poll do |message|
    puts message.body
  end
end

message是一个结构。方法:body当然不是内置在Ruby结构类中,而是作为外部库的一部分动态创建的。我想知道如何将通话存根到:body

我的RSpec测试看起来像这样:

let(:poller) { instance_double(ExternalLibrary::QueuePoller) }
let(:msg) { instance_double(Struct) }

before do
  allow(ExternalLibrary::QueuePoller).to receive(:new).and_return(poller)
  allow(poller).to receive(:poll).and_yield(msg)
end

it 'polls the queue' do
  allow(msg).to receive(:body)
  described_class.new.test_method
end

但我有以下错误:

  1) polls the queue
     Failure/Error: allow(msg).to receive(:body)
       Struct does not implement: body

如何正确运行测试?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您可以将哈希指定为let(:msg) { instance_double(Struct) } 的第二个参数。所以而不是:

let(:msg) { instance_double(Struct, body: '') }

使用:

let(:msg) { instance_double("Struct", body: '') }

不确定您是否会在引号中使用顶级结构:

pools

这一切都基于以下链接: https://relishapp.com/rspec/rspec-mocks/docs/verifying-doubles/dynamic-classes 这似乎解决了同样的问题