9

我正在通过创建一个“普通的旧 Ruby”演示者对象来清理一些依赖于一些自定义控制器帮助器方法的代码。在我的控制器中,我可以将视图上下文传递给类:

def show
  # old code: view_context.bad_helper_method
  @foobar = FoobarPresenter.new(Foobar.find(params[:id]), view_context)
end

class FoobarPresenter
  def initialize(model, view_context)
    @model = model
    @view_context = view_context
  end

  def something
    @view_context.bad_helper_method
  end
end

但是,我不确定在我的测试中要通过什么。我宁愿动态拉取 helper/view_context,这样我就不必将它传递进去。

如何访问控制器外部的视图/控制器帮助程序上下文?

这是一个 Rails 3.2 项目。

4

4 回答 4

12

比你想象的更简单!(我失去了将近一个小时才找到方法)

您可以实例化一个 ActionView

_view_context = ActionView::Base.new

并在你的测试中使用它

FoobarPresenter.new(Foobar.new, _view_context)
于 2017-03-01T11:54:31.377 回答
6

如何测试期望值?

  1. 测试控制器(注意这subject是控制器的实例,假设我们正在使用 进行测试rspec-rails):

    view_context     = double("View context")
    foobar_presenter = double("FoobarPresenter")
    
    allow(subject).to receive(:view_context).and_return(view_context)
    allow(FoobarPresenter).to receive(:new).with(1, view_context).and_return(foobar_presenter)
    
    get :show, id: 1
    
    expect(assigns(:foobar)).to eql(foobar_presenter)
    
  2. 主持人测试:

    view_context = double('View context', bad_helper_method: 'some_expected_result')
    presenter    = FoobarPresenter.new(double('Model'), view_context)
    
    expect(presenter.something).to eql('some_expected_result')
    
于 2015-01-10T00:29:11.053 回答
1

很遗憾,我没有给你一个完美的答案。但是,我已经挖掘了 Draper Decorator 库,他们已经解决了这个问题。

特别是,它们有一个 HelperProxy 类和一个 ViewContext 类,它们似乎可以自动推断出您想要的上下文。

https://github.com/drapergem/draper

他们也有一些关于这两个类的规范,我相信你可以在设置自己的规范时借鉴这些规范。

于 2015-01-10T00:16:02.110 回答
0

基于此答案,以下(稍作修改的版本)对我有用:

  1. 将以下内容添加到rails_helper.rb
config.include ActionView::TestCase::Behavior, file_path: %r{spec/presenters}

(假设您的演示者课程位于/presenters文件夹中)

  1. 在此之后,您可以通过以下view方法访问规范中的视图上下文:
FoobarPresenter.new(Foobar.new, view)
于 2021-08-26T01:17:31.017 回答