Какой класс ожидать при вызове вспомогательного метода при вызове из представления?
У меня есть представление, которое вызывает помощника. В моих тестах 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)