使用Capybara / Rspec进行登录测试

3

我在测试登录过程中遇到了一些困难。目前,我的请求规范如下:

     describe "GET /admins" do
        before(:each) do
          @admin = Factory.create(:user, :winery => nil, :email => 'admin@example.com', :admin => true)
          @attr = { :email => @admin.email, :password => @admin.password }
        end


    it "should log admin users in" do
      visit admin_path
      post_via_redirect admin_path, :session => @attr
      save_and_open_page
      page.should have_content('Admin Dashboard')
    end
  end

这里出现了错误,save_and_open_page只显示我的登录页面(我可以正常登录到我的开发网站,所以实际代码是有效的)。我还尝试使用Capybara填写表单并点击登录按钮编写规范,但结果相同。我已经能够使用Selenium编写通过的Cucumber规范。
使用: Capybara(0.4.1.2) Rspec(2.5.0) rspec-rails(2.5.0) rails(3.0.5)
谢谢
2个回答

7

在这里,您应该使用纯Capybara助手,post_via_redirect是Rails方法。您首先需要填写表单,然后按下某种提交按钮,例如:

visit admin_path
fill_in "Login", :with => "username"
fill_in "Password", :with => "password"
click_button "Submit"

你的最终断言,我建议更加精确地说明应该在哪个选择器中显示内容,如下所示:

within_scope("h1") do
  page.should have_content('Admin Dashboard')
end

现在您正在进行正确的测试!

我已经尝试过使用纯Capybara步骤,但问题依旧存在。当我尝试测试普通用户的登录时,也遇到了这个问题。我的身份验证基本上是从railstutorial网站复制的,并且可以正常工作,但我似乎无法对其进行测试。 - dasBoots

0

在尝试使用Rspec和cucumber测试这个问题的各种方法后,我终于发现了自己造成的问题。
在我的表单(使用haml和formtastic)中,我有以下内容:

 = semantic_form_for @session, :as => :session, :url => { :action => "create" } do |form|
    = form.inputs do
      = form.input :email, :label => "Email"
      = form.input :password, :label => "Password"
    %fieldset.buttons
      %ol
        %li
          %button(name = "commit" type = "commit" value = "Login")Log In

这段代码在Chrome和Firefox中可以正常运行(如果有一个场景标记为@selenium),但在我的测试中,fill_in和click_button步骤通过了,但我的控制器中的Create操作没有被调用。将我的按钮代码更改为如下内容:
   = form.input :password, :label => "Password"
    = form.buttons do
      = form.commit_button "Log In"

现在我的测试可以通过了。虽然不确定原因,但至少我可以继续进行集成测试了。


3
按钮的类型不应该是“commit”,根据规范,这不是一个有效的类型。应该将其更改为“submit”。 - edk750

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接