此代码循环并打印整个散列,但如果散列的大小大于4MB,则仅迭代前十个元素。
<% sections_content.each do |title, summary| %>
<tr>
<td style="border-bottom: 1px solid #eeeeee;"><%= raw title %></td>
</tr>
<tr>
<td><%= raw summary %></td>
</tr>
<% break if ObjectSpace.memsize_of(sections_content) > 4194304 && index == 9 %>
<% end %>
我想为它编写一个测试,以确保当索引等于9时循环中断,这意味着它会遍历前十个元素。
我在考虑这样的事情:
require 'test_helper'
test "should size> 400" do
assert_equal(9, index, [msg])
end
测试不起作用。任何有关测试此代码的更好方法的帮助[原文如此]
答案 0 :(得分:1)
为了正确单元测试,您需要首先使其更加可测试。将相关代码移动到辅助方法中,然后测试该方法;不要只是在视图中塞满你的所有逻辑。
换句话说,创建一个辅助方法(可能在./app/helpers/
中的某个地方):
def section_summaries(sections_content)
sections_content.map.with_index do |title, summary, index|
# Generate HTML code...
break if ObjectSpace.memsize_of(sections_content) > 4194304 && index == 9
end
end
然后在您的视图中,调用辅助方法:
<%= section_summaries(sections_content) %>
在您的规范中,直接测试辅助方法:
require 'test_helper'
test "only show first 10 summaries for large dataset" do
assert_equal(10, section_summaries(sections_content).length)
end
这只是一个粗略的指南;您的实际实施可能略有不同。要点的重点是尝试将逻辑分离为单元可测试性的方法/类。