【发布时间】:2013-07-23 09:23:34
【问题描述】:
问题
我想编写测试来检查显示在“显示”和“表单”部分中的模型字段。我成功的是“表演”,而不是“形式”。
主要约束:解决方案必须能够循环遍历包含模型字段的每个名称的数组。
我相信这个案例对于任何试图缩短其测试脚本文件、同时拥有许多字段并完全控制显示的内容和不显示的内容的人来说可能会很有趣,所以我会努力寻找一个解决方案,请在您的帮助下:)
表单视图
没有什么花哨的
= form_for @user do |f|
= f.select :field_1, options_from_collection_for_select ...
= f.text_field :field_2
...
实际情况
我为“显示”部分找到了一种简单的方法,这是我的规范文件的样子:
def user_fields_in_show_view
[:field_1, :field_2, ..., :field_n]
end
it 'display fields' do
user_fields_in_show_view.each do |field|
User.any_instance.should_receive(field).at_least(1).and_call_original
end
render
end
这很好用。
-
但完全相同的技术在“表单”部分中不起作用,使用相同的代码
def user_fields_in_form_view # List of fields need to be different, because of the associations
[:field_1_id, :field_2, ..., :field_n]
end
it 'display fields' do
user_fields_in_form_view.each do |field|
User.any_instance.should_receive(field).at_least(1).and_call_original
end
render
end
它像这样发出呜呜声:
Failure/Error: Unable to find matching line from backtrace
Exactly one instance should have received the following message(s) but didn't: field1_id, field_2, ..., field_n
# Backtrace is long and shows only rspec/mock, rspec/core, rspec/rails/adapters, and spork files
到目前为止我尝试了什么
1-我注释掉了我的测试的存根部分并将rendered 输出到控制台,以手动检查我的视图生成的内容,是的,这些字段是正确生成的。
2-我用分配给视图的模型替换了User.any_instance,错误略有不同,但仍然无法正常工作
it 'display fields' do
user = create :user
assign :user, user
user_fields_in_form_view.each do |field|
user.should_receive(field).at_least(1).and_call_original
end
render
end
给予:
Failure/Error: user.should_receive(field).at_least(1).and_call_original
(#<User:0x0000000506e3e8>).field_1_id(any args)
expected: at least 1 time with any arguments
received: 0 times with any arguments
3- 我更改了代码,使it 在循环内,如下所示:
user_fields_in_form_view.each do |field|
it 'display fields' do
user = create :user
assign :user, user
user.should_receive(field).at_least(1).and_call_original
render
end
end
结果和上面一样
而且我没有选择余地了。我怀疑 FormBuilder 的内部结构对我不利,但我无法弄清楚,我对这些还不是很了解。感谢阅读
【问题讨论】:
-
如果将
user.should_receive更改为User.any_instance.should_receive会发生什么?在这种情况下测试是否有效? -
一个更神秘的输出消息,但仍然没有通过
-
嗯...这很有趣。你能显示查看代码吗?另外,你确定你在代码中调用
first_name、last_name吗?也许有类似user.attributes.slice(*current_role.allowed_user_attrbutes).each { |k,v| ... }的代码? -
我刚刚编辑了我的问题,我会在几分钟内添加您提出的问题。感谢您的帮助
-
我在上次编辑期间解析了部分视图代码。真的没有什么花哨的,我有一些辅助方法,但它们只将我的字段包装在 div 和标签中,准备传递给表单构建器的选项哈希等......在链的末端,它是 Rails FormBuilder 做所有的工作.没有打电话给模特
attributes,也没有类似的东西。我没有扩展 FormBuilder 的 gem 或自定义类。
标签: ruby-on-rails rspec2 ruby-on-rails-4 rspec-rails