RSpec Stubbing:返回参数

Posted

技术标签:

【中文标题】RSpec Stubbing:返回参数【英文标题】:RSpec Stubbing: Return the parameter 【发布时间】:2011-08-21 17:40:58 【问题描述】:

虽然我的问题很简单,但我在这里找不到答案:

如何存根方法并返回参数本身(例如在执行数组操作的方法上)?

类似这样的:

 interface.stub!(:get_trace).with(<whatever_here>).and_return(<whatever_here>)

【问题讨论】:

【参考方案1】:

注意:stub 方法已被弃用。请参阅this answer 了解执行此操作的现代方式。


stub! 可以接受一个块。块接收参数;块的返回值就是存根的返回值:

class Interface
end

describe Interface do
  it "should have a stub that returns its argument" do
    interface = Interface.new
    interface.stub!(:get_trace) do |arg|
      arg
    end
    interface.get_trace(123).should eql 123
  end
end

【讨论】:

谢谢,这正是我想要的!我知道答案一定很简单:) @SirLenzOrlot,不客气!感谢您的复选标记,祝您黑客愉快。 这个可以和sequence起作用的情况结合(比如第一次调用返回参数,下一次返回“disconnected”)? @Sir,是的,但这似乎不是一种简单的方法。为什么不直接指定它应该接收(例如)“foo”并返回“foo”,然后接收“bar”并返回“disconnected”? 我在***.com/questions/7754733/…得到了两个答案【参考方案2】:

存根方法已被期望弃用。

expect(object).to receive(:get_trace).with(anything) do |value| 
  value
end

https://relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuring-responses/block-implementation

【讨论】:

这不应该是allow而不是expect吗? @MarkoAvlijaš 仅当您不想设置调用该方法的期望时。【参考方案3】:

您可以使用allow(存根)代替expect(模拟):

allow(object).to receive(:my_method_name)  |param1, param2| param1 

使用命名参数:

allow(object).to receive(:my_method_name)  |params| params[:my_named_param] 

这是一个真实的例子:

假设我们有一个S3StorageService,它使用upload_file 方法将我们的文件上传到S3。该方法将 S3 直接 URL 返回到我们上传的文件。

def self.upload_file(file_type:, pathname:, metadata: ) …

出于多种原因(离线测试、性能改进……),我们希望对上传进行存根:

allow(S3StorageService).to receive(:upload_file)  |params| params[:pathname] 

那个存根只返回文件路径。

【讨论】:

以上是关于RSpec Stubbing:返回参数的主要内容,如果未能解决你的问题,请参考以下文章

失败/错误:需要'rspec/rails'类型错误:错误的参数类型类(预期模块)Rspec V3

rspec 测试错误数量的参数

Rspec 控制器测试,传递 JSON 参数

Rspec如何创建一个方法来“干燥”请求的一些参数?

为啥在测试 RSPEC 时 JBuilder 不返回 JSON 中的响应正文

RSpec在请求后发送原始JSON参数