【问题标题】:test for new user locking function I wrote for Rails Tutorial app测试我为 Rails 教程应用程序编写的新用户锁定功能
【发布时间】:2012-04-15 02:08:47
【问题描述】:

我已经完成了 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 解决不同的问题,但在这种情况下,我发现它的用途有限。

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

-马特

【问题讨论】:

    标签: ruby-on-rails railstutorial.org


    【解决方案1】:

    你应该先写测试;)

    从您的测试开始,我一直在努力完成整个过程。我已经到了和你一样的错误的地步。使用 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! (阅读“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
    

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

    【讨论】:

    • 嗨,埃里克,再次感谢您的帮助!我在 user_pages_spec.rb 文件的各个部分尝试了您在上面修改过的测试,但没有运气。即使在设置 binding.pry 断点然后检查 page.body 之后,我也可以看到“解锁”链接在页面上并且locked_user 是正确的。我想知道我是否正在以测试框架可以理解的方式创建链接。这是_user.html.erb的相关部分:&lt;% if current_user.admin? &amp;&amp; user.locked? &amp;&amp; !current_user?(user) %&gt; | &lt;%= link_to "unlock", unlock_user_path(user), method: :get, confirm: "Enable new user?" %&gt; &lt;% end %&gt;
    • 在断点处尝试 unlock_user_path(user) 以确保它是您所期望的。
    • 结果如下:[1] pry(#&lt;RSpec::Core::ExampleGroup::Nested_1::Nested_1::Nested_1::Nested_1::Nested_1&gt;)&gt; unlock_user_path(user) =&gt; "/users/826/unlock" [2] pry(#&lt;RSpec::Core::ExampleGroup::Nested_1::Nested_1::Nested_1::Nested_1::Nested_1&gt;)&gt;。我还发现并尝试了 Capybara 的 save_and_open_page 方法,该方法在相关位置打开了一个带有相关页面的 Web 浏览器,它显示了我期望的页面。我正在考虑将此测试从 user_pages_spec.rb 文件中弹出,并将其放入自己的测试文件中,以将其与其他任何可能干扰的东西隔离开来。
    • 您的测试(在问题中)正在检查“user_path(locked_user)”,但您正在视图中创建“unlock_user_path(user)”。
    • 是的,修复它使测试通过。接得好!再次感谢。
    【解决方案2】:
        it { should have_link('unlock', href: user_path(locked_user)) }
    

    乍一看你需要使用response.body.should have...page.should.have...之类的东西。

    还可能需要render_views

    【讨论】:

      【解决方案3】:

      你可能想要:

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

      请注意,我使用的是 let!(),而不是 let()。有关let()let!() 的更多信息,请参阅rspec docs 以及此处为何重要。

      【讨论】:

        猜你喜欢
        • 2011-01-27
        • 1970-01-01
        • 2011-01-12
        • 2013-01-22
        • 2020-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-05
        相关资源
        最近更新 更多