这是RoR教程测试中的冲突吗?

时间:2014-08-08 18:22:59

标签: ruby-on-rails ruby-on-rails-4 rspec capybara railstutorial.org

我正在关注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子句冲突,这需要 管理员删除的链接不存在。

我在这里错过了什么吗?

我还没有运行这件事,但在我看来它必须失败。

2 个答案:

答案 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