RSpec - 尝试存根返回自己的参数的方法

时间:2016-01-29 23:18:25

标签: ruby rspec stubbing

我有一种方法,我试图在我的单元测试中存根。使用一个参数(一个字符串)调用真实方法,然后发出一条文本消息。我需要删除该方法,但返回作为参数传入的字符串。

我在RSpec测试中的代码是:

allow(taxi_driver).to receive(:send_text).with(:string).and_return(string)

返回:

NameError: undefined local variable or method 'string'

如果我将return参数更改为:string,则会出现以下错误:

Please stub a default value first if message might be received with other args as well

我已经尝试使用谷歌搜索和检查relishapp.com网站,但无法找到一些看似简单明了的答案。

2 个答案:

答案 0 :(得分:4)

你可以传递一个块:

allow(taxi_driver).to receive(:send_text).with(kind_of(String)){|string| string }
expect(taxi_driver.send_text("123")).to eq("123")

答案 1 :(得分:0)

  

我的方法被调用如下:send_text("现在的时间是#{Time.now}")。字符串根据时间而变化,这就是为什么我需要mock来返回变化的字符串。也许这不是在模拟的范围内做到这一点?

在这种情况下,我通常使用Timecop gem来冻结系统时间。以下是一个示例用例:

describe "#send_text" do
  let(:taxi_driver) { TaxiDriver.new }

  before do
    Timecop.freeze(Time.local(2016, 1, 30, 12, 0, 0))
  end

  after do
    Timecop.return
  end

  example do
    expect(taxi_driver.send_text("the time now is #{Time.now}")).to eq \
      "the time now is 2016-01-30 12:00:00 +0900"
  end
end