我正在关注Michael的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)>'
这里可能出现什么问题,或者更重要的是如何调试它?
分叉我的代码答案 0 :(得分:9)
您希望/users
页面包含旁边带有“删除”链接的用户列表。但是你没有用简单的用户填充你的TEST数据库。它只包含一个用户admin。但根据您的users/_user.html.erb
,此类用户没有“删除”链接。因此,添加至少一个用户创建语句,然后重试。
答案 1 :(得分: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 =&gt;是的,然后由attr_accessible删除。
但更重要的是,你如何调试它?通过询问“发生了什么?”和“我期待发生什么?”以及其中的变化,直到你发现两个问题的答案在中间相遇。在这种情况下,我开始提出的问题是:导致链接显示的是什么?我在规范中设置的模型是真的吗?规格是否达到了我期望的页面?当我使用浏览器点击页面时,模型是否以相同的方式运行?
但所有这些只是“正在发生的事情的变化?”和“我期待发生什么?”