【发布时间】:2026-01-01 11:50:01
【问题描述】:
我的控制器中有一个动作,它使用我无法控制的 API 中的对象实例加载实例变量:
def index
@obj = MyObj.find(id: params[:id])
end
MyObj.find 进行 API 调用并将 API 返回的内容返回给我。
现在假设我想为我的视图编写一个测试,但我不能使用测试数据库,因为我的应用依赖于该 API。我永远不能指望 API 返回一个可测试的对象,而我想尝试的一些测试取决于该对象的状态。
我希望能够在渲染我的视图之前手动创建我自己的测试@obj,并让我的测试在由该@obj 通知的视图渲染上运行。
理想情况下是这样的:
before(:all) do
@obj = {attr1: "abc", attr2: 123}
driver.navigate.to("#{ENV['RAILS_HOST']}/my_view/123")
end
这显然行不通。有没有办法做到这一点?
编辑:尝试存根该方法似乎不起作用,这是它目前的样子:
规格:
before(:each) do
allow(Library::Equipment)
.to receive(:mymethod)
.with(123)
.and_return("Stub method")
puts Library::Equipment.mymethod(123)
#prints "Stub method"
driver.navigate.to("#{ENV['RAILS_HOST']}/library/equipments/123/variables")
end
/library/equipments/:equipment_id/variables 路由到library/variables#index,如下所示:
def index
@test = Library::Equipment.mymethod(123)
puts @test
#prints "Real method"
# other code...
end
我的Library::Equipment 类有这个类方法:
def self.mymethod(param)
"Real method"
end
在我的index.html.erb 中,我只需<%= @test %> 即可查看其中包含的内容。如您所见,mymethod 的返回值在从我的规范文件和我的 index 操作调用时有所不同
【问题讨论】:
-
使用
RSpec::Mocks.with_temporary_scope将允许您在before(all)中使用存根,但在作用域结束时会删除存根。请删除with_temporary_scope并同时将before(:all)更改为before(:each)/before。 -
结果是一样的,我已经编辑了问题以反映所做的更改。
标签: ruby-on-rails api selenium testing rspec