Rails、rspec:使用 "send()" 为控制器规范动态生成水豚 URL
Rails, rspec: using "send()" to dynamically generate capybara URLs for controller specs
#show 动作的控制器规范内:
resource_name = "adoption_transfer_type"
it "returns a single resource" do
resource = create(resource_name.to_sym)
# Works
xhr :get, api_v1_lookups_adoption_transfer_type_path(resource.id)
# Does not work
xhr :get, send("api_v1_lookups_#{resource_name}_path(#{resource.id})")
end
它导致以下错误:
Failure/Error: xhr :get, send("api_v1_lookups_adoption_transfer_type_path(#{resource.id})")
NoMethodError:
undefined method `api_v1_lookups_adoption_transfer_type_path(66)'
看起来 send(...)
将其转换为字符串文字而不是将其作为 Ruby 代码执行,但我认为这就是 send(...)
方法的目的。
更广泛的情况是,我正在使用单个规范文件为多个查找资源生成规范,因为它们都是相同的,而且当我可以在一个文件中完成所有操作时,没有理由管理 10 个以上的文件。
字符串内插到 api_v1_lookups_adoption_transfer_type_path(2)
,这意味着您正试图通过该名称调用某个方法。相反,你想要:
send("api_v1_lookups_#{resource_name}_path", resource.id)
这是将参数传递给发送调用的方式,我也会养成使用 public_send
=)
的习惯
#show 动作的控制器规范内:
resource_name = "adoption_transfer_type"
it "returns a single resource" do
resource = create(resource_name.to_sym)
# Works
xhr :get, api_v1_lookups_adoption_transfer_type_path(resource.id)
# Does not work
xhr :get, send("api_v1_lookups_#{resource_name}_path(#{resource.id})")
end
它导致以下错误:
Failure/Error: xhr :get, send("api_v1_lookups_adoption_transfer_type_path(#{resource.id})")
NoMethodError:
undefined method `api_v1_lookups_adoption_transfer_type_path(66)'
看起来 send(...)
将其转换为字符串文字而不是将其作为 Ruby 代码执行,但我认为这就是 send(...)
方法的目的。
更广泛的情况是,我正在使用单个规范文件为多个查找资源生成规范,因为它们都是相同的,而且当我可以在一个文件中完成所有操作时,没有理由管理 10 个以上的文件。
字符串内插到 api_v1_lookups_adoption_transfer_type_path(2)
,这意味着您正试图通过该名称调用某个方法。相反,你想要:
send("api_v1_lookups_#{resource_name}_path", resource.id)
这是将参数传递给发送调用的方式,我也会养成使用 public_send
=)