【发布时间】:2015-02-06 09:56:42
【问题描述】:
我有一个视图,它调用了一个助手。在我的 rspec 测试中,我想检查是否使用适当的属性调用了此帮助程序。
<div class="chart">
<%= chart_tag(:pie, {css: 0.1, javascript: 0.3, ruby: 0.6}) %>
</div>
我不想测试chart_tag 是否呈现正确的 HTML;它是一个复杂的助手,可以设置各种data- 属性;它设置了 highcharts 参数。此方法本身已经过正确测试。
我想测试类似的东西:
expect(TemplateClass::SomeHelper).to receive(:chart_tag).with(:pie)
我不知道在哪里设置期望:我不知道单元格如何呈现事物。它似乎利用了 rails 的渲染堆栈,但这对我来说也是一个陌生的领域。
我通过cells 调用它,因此通用rspec view 不适用于此处。
在单元格中,助手包含在helper 中,据我所知,它是rails method。但是按照那段代码,仍然没有告诉我视图中包含什么,通过什么代理、类或模块。
为了说明堆栈/代码的一部分:
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
知道用什么来测试消息期望吗?
【问题讨论】:
-
盲猜:由于helper是一个模块,所以混入renderer类,那么接收消息的是renderer类,而不是模块。所以你的期望应该是针对渲染器
-
还有一个猜测:
chart_tag是实例方法(不是类) -
还有一个猜测:
expect(ChartHelper).to receive(:chart_tag)应该是expect_any_instance_of(AnalysisCell).to receive(:chart_tag) -
expect_any_instance_of(AnalysisCell)不匹配。expect_any_instance_of(Class)也没有。在 render_to_string 堆栈深处的某个地方似乎正在发生一些奇怪的事情。潜水更深。 -
@gotva:一个什么例子?调用者(Cell)还是渲染者?如果是渲染器,要测试的实例是什么?
标签: ruby-on-rails rspec rails-cells