Какой класс ожидать при вызове вспомогательного метода при вызове из представления?

У меня есть представление, которое вызывает помощника. В моих тестах rspec я хочу убедиться, что этот помощник вызывается с соответствующими атрибутами.

<div class="chart">
  <%= chart_tag(:pie, {css: 0.1, javascript: 0.3, ruby: 0.6}) %>
</div>

Я не хочу это проверять chart_tag отображает правильный HTML; это сложный помощник, который устанавливает все виды data- атрибуты; это устанавливает высокие параметры. Этот метод сам проверен должным образом.

Я хочу проверить что-то вроде:

expect(TemplateClass::SomeHelper).to receive(:chart_tag).with(:pie)

Я не знаю, где возлагать надежды: я не знаю, как клетки представляют вещи. Кажется, он использует стек рендеринга рельсов, но для меня это тоже незнакомая область.

Я называю это через клетки, поэтому общий rspec view здесь не распространяется

В ячейках помощники включены с helperНасколько я могу судить, это метод рельсов. Но, следуя этому коду, все равно не рассказывает, что включено в представление, через какой прокси, класс или модуль.

Чтобы проиллюстрировать часть стека / кода:

class AnalysisCell < Cell::Rails
  helper ChartHelper

  def chart(params)
    @type = params[:type] || :pie
    @dataset = params[:dataset] || {}
    render # Cells will now, magically, parse and process app/cells/analysis/chart.html.erb
  end
end

app/cells/analysis/chart.html.erb

<%= debugger %>
<%= chart_tag(:pie, {css: 0.1, javascript: 0.3, ruby: 0.6}) %>

app/helpers/chart_helper.rb

module ChartHelper
  def chart_tag(type, dataset)
  end
end

Попадая в отладчик, я могу проверить состояние изнутриerb:

self.class #=> #<Class:0x007f9eef0215a8>
self._helpers #=> NoMethodError Exception: undefined method `_helpers
self.methods.sort #=>
# [...
# :cell_for,
# :chart_tag,
# :check_box_tag,
# ...]
# self.method(:chart_tag).owner #=> ChartHelper

Но тест не проходит с received: 0 times with any argument:

it 'renders a chart' do
  expect(ChartHelper).to receive(:chart_tag) #.with(:pie, {})
  render_cell(:analysis, :chart, type: :pie, dataset: {})
end

Любая идея, что проверить сообщение-ожидание на?

1 ответ

На мой взгляд, спецификации я бы написал

expect(view).to receive(:chart_tag).with(:pie)
Другие вопросы по тегам