Assert_Difference Rails测试无法验证用户已删除但似乎在应用程序中工作?

时间:2016-03-02 14:15:18

标签: ruby-on-rails ruby railstutorial.org ruby-on-rails-4.2

我正在使用Rails Tutorial by Michael Hartl,但在使用此测试向用户路径发出删除请求时,我正在努力验证用户是否已被销毁。

当我在Cloud 9上启动应用程序并实际进入所有用户索引并删除用户时,它确实消失了,所以这一直是一个障碍!

这是user_index_test.rb文件

require 'test_helper'

class UsersIndexTest < ActionDispatch::IntegrationTest

def setup
   @user = users(:Robert)
   @admin     = users(:Robert)
   @non_admin = users(:archer)
end

test "index as admin including pagination and delete links" do
  log_in_as(@admin)
  get users_path
  assert_template 'users/index'
  first_page_of_users = User.paginate(page: 1)
  first_page_of_users.each do |user|
    assert_select "a[href=?]", user_path(user)
    unless user == @admin
      assert_select user_path(user), :text => 'delete'
    end
  end

  assert_difference 'User.count', -1 do
    delete user_path(@non_admin)
  end
end
end 

这是index.html.erb文件

  <ul class="users">
    <% @users.each do |user| %>
      <li>
        <%= gravatar_for user, size: 50 %>
        <%= link_to user.name, user %>
        <% if current_user.admin? && !current_user?(user) %>
          <%= link_to "delete", user, method: :delete,
                                 data: { confirm: "You sure?" } %>
        <% end %>
      </li>
      <% end %>
  </ul>
  <%= will_paginate %>

错误代码:

      ....................................DEPRECATION WARNING: The assertion 
  was not run because of an invalid css selector.
  unexpected '950961012' after 'CHILD_SELECTOR' (called from block (2  
  levels) in <class:UsersIndexTest> at 
 /home/ubuntu/workspace/test/integration/users_index_test.rb:19)
  F...

    1) Failure:
  UsersIndexTest#test_index_as_admin_including_pagination_and_delete_links       
  [/home/ubuntu/workspace/test/integration/users_index_test.rb:23]:
  "User.count" didn't change by -1.
  Expected: 1
  Actual: 2

我已经尝试将assert_select更改为[href =],[href],在查看源代码后删除折旧警告但更无效。我已经被困在这里几天了,我想问一下。

任何帮助表示赞赏:)

更新1: 正如@UriAgassi指出的那样,我的assert_select语句失败了,导致Rails没有选择正确的标签,因此没有通过DELETE请求。

所以我试图创建一个新的assert_select命令,但麻烦的是,我试图选择的<a>标签就在一个锚标签之后。

新用户指数测试:

    first_page_of_users.each do |user|
    assert_select "a[href=?]", user_path(user), :text => user.name
      unless user == @admin
         assert_select "a[class=?]", 'user', :test => 'delete'
      end
    end

HTML页面

     <li>
       <img alt="Robert" class="gravatar"   
 src="https://secure.gravatar.com/avatar/e831ff7d5e2cad2c7da9249aa28343c9?s=50" />
       <a href="/users/1">Robert</a>
     </li>
     <li>
       <img alt="Dr. Lonzo Rosenbaum" class="gravatar" 
 src="https://secure.gravatar.com/avatar/ef4fac9f70a2ad49b02546f3aa416a61?s=50" />
       <a href="/users/3">Dr. Lonzo Rosenbaum</a>
       **<!-- User to delete, tag to select class="user"-->**
         <a class="user" data-confirm="You sure?" 
          rel="nofollow" data-method="delete" href="/users/3">delete</a>
     </li>

新错误讯息:

     1) Failure:
 UsersIndexTest#test_index_as_admin_including_pagination_and_delete_links 
 [/home/ubuntu/workspace/test/integration/users_index_test.rb:19]:
 Expected at least 1 element matching "a[class="user"]", found 0..
 Expected 0 to be >= 1.

2 个答案:

答案 0 :(得分:0)

所以看起来测试没有正确调用destroy动作 试试这样:

delete :destroy, id: @non_admin.id

答案 1 :(得分:0)

您的语法错误很少,可能会在第19行上破坏您的测试:

assert_select user_path(user), :text => 'delete'

这应该是:

assert_select user_path(@user), :text => 'delete'