Rspec 请求规范检查响应正文

Rspec request spec examine response body

因为 rspec 3.5 请求规范用于测试控制器行为加上路由测试以及视图与内容的正确呈现。 最后一部分让我有点困扰,因为我不明白视图规范中的内容与请求规范中保留的内容之间的细线。

我在 relishapp 上找到了这篇文章:

expect(response.body).to include("Widget was successfully created.")

这促使我在我的请求测试中包含以下内容:

describe "Index page" do
  ....
  it 'includes a link to cars_parts' do
    get "/car_overview"      
    expect(response.body).to include("car_parts_path")
  end
  ....
end 

本次测试失败。 在视图中,我在 car_parts url_helper 上使用了 link_to。 失败的测试转储了整个 response.body 字符串,我看到了 car_parts_path 但 rspec 没有看到它。我如何更改我的测试以使其在不使用水豚的情况下通过,因为它现在只能用于功能规范。 毕竟我做的是正确的还是应该去别的地方做这种测试?

我认为您可能需要将字符串更改为方法。

之前

expect(response.body).to include("car_parts_path")

之后

expect(response.body).to include(car_parts_path) # Remove the quotes

说明

car_parts_path 是 Rails 中的一个方法,它将评估为实际路径。如果您在您的视图中使用 URL 助手,这应该有效。

但是我以为响应体是字符串?

是的,是的。当您调用 car_parts_path 时,您正在调用 Rails 框架中的 Ruby 方法。

car_parts_pathreturn 一个字符串。该字符串将是 "/car_parts".

基本上,只要您看到 car_parts_path,就把它想象成一个字符串 "/car_parts"。因为两者完全等价。

测试中

所以当你在测试中有这个:

expect(response.body).to include(car_parts_path) # car_parts_path is a method that returns "/car_parts" so it's the same as...

它的计算结果与:

expect(response.body).to include("/car_parts")

在视图中

在您的 ERB 视图中,您将拥有:

<%= link_to "Car Parts", car_parts_path %>

这被评估为:

<%= link_to "Car Parts", "/car_parts" %>

这会在您的 html:

中呈现一个 a 标签
<a href="/car_parts">Car Parts</a>

结论

您正在检查响应正文中的 "/car_parts",并且视图包含该字符串,现在测试通过,一切就绪!

为什么我的原始代码不起作用?

Rails 正在寻找 "car_parts_path" 作为字符串 - 而视图在任何地方都不包含它。

您正在寻找字符串形式的方法名称,而不是方法 returns.

的字符串

还有什么问题,尽管问!