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 =)

的习惯