Rspec请求规范检查响应主体

时间:2018-12-04 13:06:16

标签: ruby-on-rails ruby-on-rails-3 rspec rspec-rails

由于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 

此测试失败。 在视图中,我在link_to上使用car_parts url_helper。 测试失败,转储了整个response.body字符串,我看到了car_parts_path,但是rspec没有看到它。我该如何更改测试以使其通过而无需使用水豚,因为它现在仅适用于功能规格。 我到底是不是做对了,还是应该在其他地方进行这种测试?

1 个答案:

答案 0 :(得分:3)

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

之前

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_path返回一个字符串。该字符串将为"/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"作为字符串-并且视图在任何地方都不包含该字符串。

您正在寻找方法名称作为字符串,而不是方法返回的字符串。

还有其他问题,问问吧!