用最小的水豚摧毁铁轨中的测试

时间:2013-12-20 01:01:31

标签: ruby-on-rails capybara minitest

我正试图让语法恰到好处。我想我很接近,但我正在尝试进行测试,以表明我的管理员可以摧毁用户。我现在得到的错误是:

Ambiguous match, found 2 elements matching link or button "delete

我完全理解这一点。这意味着我进入用户索引页面,我看到普通用户和管理员的删除按钮。如何确切地指定要单击删除按钮的用户,以便我可以在测试中删除它们。

这是我的users.yml文件

user:
  name: user
  email: user@examle.com
  admin: false
  password_digest: <%= BCrypt::Password.create('password') %>

admin:
  name: admin
  email: admin@admin.com
  admin: true
  password_digest: <%= BCrypt::Password.create('password') %>

这是我的admin_test.rb文件

require "test_helper"

feature "as a blog owner I want a working user delete so I can remove trolls" do
  scenario 'admin can delete profile' do
    visit new_session_path
    fill_in 'Email', with: users(:admin).email
    fill_in 'password', with: 'password'
    click_on 'Log In'
    visit users_path(:admin)
    click_on 'delete'
    click_on 'OK'
    page.must_have_content "User deleted"
  end
end

我认为这个问题是由行引起的

click_on 'delete'

任何人都知道正确的语法是什么或者我搞砸了什么?

1 个答案:

答案 0 :(得分:0)

第一个问题是您可能不希望能够删除管理员。您也不想删除自己。我建议添加一个管理员?用于测试用户是否为管理员的布尔方法,以便它不显示管理员的删除选项。你认为这样的东西会起作用:

<% if current_user.admin? && !current_user?(user) %>
    | <%= link_to "delete", user, method: :delete,
                                  data: { confirm: "You sure?" } %>
<% end %>

第二个问题是当有两个相同的元素并得到一个模糊的匹配。对于很多次测试,您只想从众多中选择一个。你可以选择第一个:

first('.item').click_link('Agree')

您可以查看此答案以获取更多信息:How to click first link in list of items after upgrading to Capybara 2.0?