你为什么要嘲笑所有的路?
我想你对
事实上
嘲笑这些电话,而不仅仅是存根。看到区别
here
.
不同的演示者可能会调用不同的
path
他们的方法
view_context
.
我
推荐
您只显式模拟要在测试的演示者中调用的路径。
你不需要嘲笑所有的路径,因为它们并不是每次都会被调用。
我会把你的测试写如下:
describe UserPresenter do
subject(:user_presenter) { described_class.new(user, view: view_context)
let(:user) { FactoryBot.create(:user) }
let(:view_context) { instance_double(ActionView::Base) }
let(:some_custom_path) { 'some/custom/path' }
before do
allow(view_context).to receive(:some_custom_path).and_return(some_custom_path)
end
it 'does something'
end
关于你看到的错误,是的,
instance_double
将保护您不受未在接收器上实现的方法的干扰。
我愿意
不推荐
您可以这样做,但是如果您所要寻找的只是一个视图对象,它将无声地接受对
路径
方法然后您可以创建一个伪视图,如下所示:
class FakeView
private
def view_methods
ActionView::Base.instance_methods - Object.instance_methods
end
def method_missing(meth, *params, &block)
view_methods.include?(meth) ? nil : super
end
end
然后在测试中使用它,比如:
describe UserPresenter do
subject(:user_presenter) { described_class.new(user, view: view_context)
let(:user) { FactoryBot.create(:user) }
let(:view_context) { FakeView.new }
it 'does something'
end