2

我已经完成了 Ruby on Rails 教程的第 9 章,并添加了我自己的功能来在用户首次注册时锁定用户,这样管理员必须在新用户之前进入并批准(“解锁”)他们的 id用户有权访问该站点。我添加了一个 :locked 布尔属性,其工作方式与 User 对象的 :admin 属性类似。我现在已经全部工作了,但是我无法为它编写一个简单的测试。我在 user_pages_spec.rb 中添加了以下测试,就在层次结构“分页”-“作为管理员用户”下:

describe "as an admin user to unlock new users" do
    let(:admin) { FactoryGirl.create(:admin) }
    let(:locked_user) { FactoryGirl.create(:locked) }
    before do
      sign_in admin
      visit users_path
    end

    it { should have_link('unlock', href: user_path(locked_user)) }
    it { should_not have_link('unlock', href: user_path(admin)) }
end

并支持创建“锁定”用户,将其添加到 factory.rb:

factory :locked do
    locked true
end

我可以通过 Firefox 手动确认解锁链接是否显示,但我仍然遇到以下故障:

  1) User pages index pagination as an admin user to unlock new users 
     Failure/Error: it { should have_link('unlock', href: user_path(locked_user)) }
       expected link "unlock" to return something
     # ./spec/requests/user_pages_spec.rb:64:in `block (5 levels) in <top (required)>'

我很想知道a)为什么会失败:),还有b)如何调试这样的问题。我如何判断测试实际上“看到”了什么?正如另一个 stackoverflow 用户所建议的那样,我尝试使用 rails-pry 解决不同的问题,但在这种情况下,我发现它的用途有限。

任何想法或建议将不胜感激。提前致谢!

-马特

4

3 回答 3

0
    it { should have_link('unlock', href: user_path(locked_user)) }

乍一看,您需要使用类似response.body.should have...or的东西page.should.have...

render_views可能需要。

于 2012-04-15T03:01:14.177 回答
0

你应该先写测试;)

以您的测试为开始,我一直在努力完成整个过程。我已经到了和你一样的错误的地步。使用 pry-rails gem 并将 binding.pry 放入测试中:

it { binding.pry ; should have_link('unlock', href: user_path(locked_user)) }

(在搞砸了很多之后)我从测试复制并粘贴到命令提示符:

should have_link('unlock', href: user_path(locked_user))

并得到错误。将其更改为:

should have_link('unlock', href: user_path(User.first))

作品。在提示符处输入locked_user 会显示用户记录。接下来我输入了 page.body,它显示我的锁定用户甚至没有出现在页面上。(通过输入 User.count 进行确认,发现它是 33,所以它在第 2 页上。)您可能没有这个问题,具体取决于您的测试在规范中的嵌入程度。我意识到我不小心将它嵌入到另一个规范中。当我将它移出(User.count == 2)时,它仍然无法正常工作。我的locked_user 仍然不在页面上。User.all 也不包括用户。Hartl 在第 10 章中提到,

这使用了让!(阅读“let bang”)方法代替 let;原因是 let 变量是惰性的,这意味着它们只有在被引用时才会出现。

改变让让!它奏效了。(User.count == 3,这次包括locked_user。)这里是测试块。

describe "as an admin user" do
  let(:admin) { FactoryGirl.create(:admin) }
  before do
    sign_in admin
    visit users_path
  end

...

  describe "other users should have an unlock link" do  ## changed the description
    let!(:locked_user) { FactoryGirl.create(:locked) }
    before { visit users_path }

    it { should have_link('unlock', href: user_path(locked_user)) }
  end
end

我的代码还没有解锁任何东西(我需要对此进行另一次测试......)但链接会在它应该出现的时候出现。:)

于 2012-04-15T16:45:40.037 回答
0

你可能想要:

let!(:locked_user) { FactoryGirl.create(:locked) }

请注意,我使用let!()的是let(). 请参阅rspec 文档let()以获取有关vs的更多信息let!()以及此处为何重要。

于 2012-05-15T04:57:49.000 回答