我正在关注Michael Hartl的Ruby on Rails教程。
在他的清单9.42中,他在索引页面上显示了删除用户链接的测试
测试应该确保具有admin: true
属性的用户在用户的索引页面(用户的列表页面)上看到delete
个链接。
此外,admin(第一个用户)不应该看到删除自己的链接。
测试代码如下:
describe "delete links" do
it { should_not have_link('delete') }
describe "as an admin user" do
let(:admin) { FactoryGirl.create(:admin) }
before do
sign_in admin
visit users_path
end
it { should have_link('delete', href: user_path(User.first)) }
it "should be able to delete another user" do
expect do
click_link('delete', match: :first)
end.to change(User, :count).by(-1)
end
it { should_not have_link('delete', href: user_path(admin)) }
end
end
这段代码让我感到困惑的是:
对于我来说,描述块中的第一个it
子句似乎是合乎逻辑的
提到User.first的路径(这是admin,导致admin在数据库中是第一个)
与describe块中的第三个it
子句冲突,这需要
管理员删除的链接不存在。
我在这里错过了什么吗?
我还没有运行这件事,但在我看来它必须失败。
答案 0 :(得分:1)
当然你应该运行它来弄清楚实际情况。根据我的理解,这取决于你的database
清洁工如何工作,如果它在每次运行测试中清理数据库,这是常见情况,然后上述规范将通过。
答案 1 :(得分:1)
并非它显示在您的问题中,但第一个it
块没有冲突,因为第一个用户是在此代码之上创建的。
let(:user){FactoryGirl.create(:user)}
。
第三个阻止是指当管理员签名时,它不应该有自己的删除按钮。
这是#index
的完整规范:
subject { page }
describe "index" do
let(:user) { FactoryGirl.create(:user) } #First User Created Here
before do
sign_in user
visit users_path
end
it { should have_title('All users') }
it { should have_content('All users') }
describe "pagination" do
.
.
.
end
describe "delete links" do
it { should_not have_link('delete') }
describe "as an admin user" do
let(:admin) { FactoryGirl.create(:admin) } #Admin Created here
before do
sign_in admin
visit users_path
end
it { should have_link('delete', href: user_path(User.first)) }
it "should be able to delete another user" do
expect do
click_link('delete', match: :first)
end.to change(User, :count).by(-1)
end
it { should_not have_link('delete', href: user_path(admin)) }
end
end
end