6

我正在关注迈克尔的 ROR 教程并创建用户身份验证系统。有一个管理员权限,允许用户删除其他用户。以特权管理员用户身份登录时,用户列表页面上会出现特殊的“删除”链接。我的应用程序运行良好,但 rspec 测试因我不知道的原因而失败。

我已经将测试分离到另一个文件中spec/requests/sat_spec.rb,我正在尝试使用 pry gem 来调试它,但到目前为止还没有成功。

describe "delete links" do
  describe "as admin user" do
    let(:admin) { FactoryGirl.create(:admin) }
    before do
      sign_in admin
      visit users_path
      binding.pry          
    end
  it { should have_link('delete', href: user_path(User.first)) }

  it "should be able to delete another user" do
    expect { click_link('delete') }.to change(User, :count).by(-1)
  end    
end

测试失败:

1) separated admin tests delete links as admin user 
 Failure/Error: it { should have_link('delete', href: user_path(User.first)) }
   expected link "delete" to return something
 # ./spec/requests/sat_spec.rb:25:in `block (4 levels) in <top (required)>'

2) separated admin tests delete links as admin user should be able to delete another user
 Failure/Error: expect { click_link('delete') }.to change(User, :count).by(-1)
 Capybara::ElementNotFound:
   no link with title, id or text 'delete' found
 # (eval):2:in `click_link'
 # ./spec/requests/sat_spec.rb:28:in `block (5 levels) in <top (required)>'
 # ./spec/requests/sat_spec.rb:28:in `block (4 levels) in <top (required)>'

这里的问题可能是什么,或者更重要的是如何调试它?

你可以在这里分叉我的代码https://github.com/tomek-rusilko/miniatury_katalog_2

4

2 回答 2

9

您希望您的/users页面包含旁边带有“删除”链接的用户列表。但是您没有用简单的用户填充您的 TEST 数据库。它只包含一个用户,即管理员。但根据您的users/_user.html.erb这种类型的用户没有“删除”链接。因此,添加至少一个用户创建语句并重试。

于 2012-05-26T15:39:45.823 回答
0
let(:admin) { FactoryGirl.create(:admin) }

这很好,因为你有(在 spec/factories.rb 中)

factory :admin do
  admin true
end

但与此同时,在 models/user.rb 中:

attr_accessible :name, :email, :password, :password_confirmation

我敢打赌,工厂女孩正在使用批量分配来设置:admin => true,然后被 attr_accessible 删除。

但更重要的是,你如何调试它?通过询问“发生了什么?” 和“我期望会发生什么?” 及其变化,直到你发现两个问题的答案在中间相遇。在这种情况下,我首先要提出的问题是:是什么导致了链接显示?我在规范中设置的模型是这样吗?规范是否达到了我期望的页面?当我用浏览器点击页面时,模型的行为是否与规范中的一样?

但所有这些都只是“发生了什么?”的变体。和“我期望会发生什么?”

于 2012-05-26T15:36:37.027 回答