Ruby on rails Rspec测试失败缺少模板格式问题

Ruby on rails Rspec测试失败缺少模板格式问题,ruby-on-rails,ajax,tdd,rspec,integration-testing,Ruby On Rails,Ajax,Tdd,Rspec,Integration Testing,我正在尝试为我的应用程序实现一些集成测试,以测试一个投票系统,我已经准备好了,但是遇到了一些问题。首先,以下是我试图通过的测试代码: describe "vote_up_user" do it "should update the user rating" do click_link "user_up_arrow" response.should have_selector("#user_rating", :content => "1") end end 以下是单击的链接: &

我正在尝试为我的应用程序实现一些集成测试,以测试一个投票系统,我已经准备好了,但是遇到了一些问题。首先,以下是我试图通过的测试代码:

describe "vote_up_user" do

it "should update the user rating" do
  click_link "user_up_arrow"
  response.should have_selector("#user_rating", :content => "1")
end
end
以下是单击的链接:

<%= link_to image_tag("uparrowbig.png"), vote_up_user_path(@user), :method => :post,
        :id => "user_up_arrow", :class => "arrow", :remote => true %>
如果有人对相应的投票感兴趣,请点击vote\u up\u user.js.erb:

$("user_rating").update('<%= @voted_on_user.plusminus.to_s %>')
$("user_up_arrow").update('<%= image_tag("uparrowbigselect.png") %>')
$("user_down_arrow").update('<%= image_tag("downarrowbig.png") %>')

我可以理解为什么失败,因为我在指定的路径中没有html.erb模板。实际上我有一个js.erb文件,因为这是一个AJAX调用,但它不包含在:formats数组中,因此找不到。那么,我的问题是,当集成测试单击链接时,确保搜索:js格式的最佳方法是什么?这是我可以在测试中简单地调整的东西,还是我需要将它添加到链接助手中?

我怀疑它不起作用的原因是RSpec本身无法测试Javascript

当您将
remote=>true
添加到链接时,它只将
data remote=“true”
添加为链接的属性,这在没有Javascript的情况下并不意味着什么。这就是为什么您会在错误中看到
:formats=>[:html]
。它只会查找html视图。为了让Rails在默认情况下请求.js.erb视图,您需要将.js放在它请求的URL的末尾,或者实际使用Javascript来请求页面

为了让Javascript在测试中实际运行,您需要使用类似于Capybara的东西。当您运行测试时,您将实际看到浏览器启动,它将在浏览器中实际运行测试

如果这是您想要做的,我建议您观看Ryan Bates最近的Railscast:

根据评论进行更新

respond\u with
将只重定向到您在POST、PUT或DELETE请求中指定的位置。虽然链接中有
:method=>:post
,但当禁用Javascript时,链接将始终生成GET请求(因为您没有使用AJAX)。如果没有Javascript,生成POST请求的唯一方法是使用表单标记

如果您希望它在这种情况下优雅地降级,您应该为这些情况创建一个html视图,或者在
response_之后放置一个块,如下所示:

respond_with(@voted_on_user, :location => user_path(@voted_on_user)) do |format|
  format.html { redirect_to user_path(@voted_on_user) }
end`

谢谢你的链接,我一定会查出来的。我想知道这是否会对测试产生影响,这当然是可能的。然而,这个测试的目标不一定是测试javascript,如果我现在理解正确,这个测试将模拟没有启用javascript的浏览器(不要引用我的话)。在任何情况下,控制器操作不应该仍然呈现html而不是抛出错误吗?我有另一种情况,我发布一个表格,而不是使用链接,在这种情况下,它似乎工作得很好-这也会有不同吗?是的,你是对的。它模仿的是没有启用javascript的浏览器。由于没有启用javascript,它将查找.html.erb视图。因为你没有一个,它抛出了错误。Rails知道呈现.js.erb文件的唯一方法是将.js放在URL的末尾,或者请求头包含以下内容:
Accept:text/javascript,application/javascript
,这在实际运行javascript和执行AJAX时默认发生。如果不想测试javascript,然后,您可以只测试链接是否具有正确的URL和
dataremote
属性,而不是单击链接。然后,只需在URL末尾加上.js(例如,
get'/user/23/vote\u user\u up.js'
)即可请求URL。与其说测试javascript,不如说测试html,不如说测试使用javascript的人禁用点击链接的情况(希望这是有意义的)。由于我在控制器中使用(@voated_on_user,:location=>user_path(@voated_on_user))响应了_,我觉得非javascript请求应该优雅地降级,并简单地重定向到指定的位置OK,我想我理解了。我想当你说“确保搜索:js格式的最佳方式是什么”时我感到困惑。如果你正在测试当某人禁用Javascript时会发生什么,希望它永远不会请求js格式。不管怎样,我更新了上面的答案,希望能帮助你更好地理解你的问题。
 Missing template votes/vote_up_user with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html], :locale=>[:en, :en]}
respond_with(@voted_on_user, :location => user_path(@voted_on_user)) do |format|
  format.html { redirect_to user_path(@voted_on_user) }
end`