问题
我想编写测试来检查我的“显示”和“表单”部分中显示的模型字段。我成功了“表演”,而不是“形式”。
主要约束:解决方案必须能够遍历包含模型字段的每个名称的数组。
我相信这个案例对于那些试图缩短他的测试脚本文件的人来说可能会很有趣,同时拥有许多字段,并且可以完全控制显示的内容和不显示的内容,所以我会努力寻找解决方案,如果你愿意,你的帮助:)
表单视图
没有什么花哨
= 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 的内部结构会对我造成不良影响,但我无法弄清楚,我对这些还不是很了解。谢谢阅读