我有一个访问request.fullpath
的助手。在隔离的帮助程序测试中,request
不可用。我该怎么办?我可以以某种方式嘲笑它或类似的东西吗?
我正在使用最新版本的Rails和RSpec。这是我的助手的样子:
def item(*args, &block)
# some code
if request.fullpath == 'some-path'
# do some stuff
end
end
因此,有问题的代码行是#4,其中帮助程序需要访问辅助规范中不可用的request
对象。
非常感谢您的帮助。
答案 0 :(得分:4)
是的,您可以模拟请求。我在这里有一个很长的答案,描述了如何做到这一点,但事实上,这不一定是你想要的。
只需在示例中的helper对象上调用helper方法即可。像这样:
describe "#item" do
it "does whatever" do
helper.item.should ...
end
end
这将使您可以访问测试请求对象。如果需要为请求路径指定特定值,可以这样执行:
before :each do
helper.request.path = 'some-path'
end
实际上,为了完整起见,请让我包括我的原始答案,因为根据您的尝试,它可能仍然有用。
以下是模拟请求的方法:
request = mock('request')
controller.stub(:request).and_return request
您可以类似地向返回的请求添加存根方法
request.stub(:method).and_return return_value
模拟和替代的替代语法存储在一行中:
request = mock('request', :method => return_value)
如果你的模拟收到你没有存根的消息,Rspec会抱怨。如果还有其他的东西只是在帮助对象上调用你的请求帮助器方法就是你在测试中不关心,你可以通过使mock成为一个“空对象”来关闭rspec,例如。喜欢这样
request = mock('request').as_null_object
看起来您可能只需要通过特定测试即可:
describe "#item" do
let(:request){ mock('request', :fullpath => 'some-path') }
before :each do
controller.stub(:request).and_return request
end
it "does whatever"
end
答案 1 :(得分:0)
在帮助规范中,您可以使用controller.request
访问请求(因此controller.request.stub(:fullpath) { "whatever" }
应该有效)