加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 使用Capybara将用户保存在数据库之间?

发布时间:2020-12-17 02:05:55 所属栏目:百科 来源:网络整理
导读:我的问题是我必须为每个单独的水豚测试创建一个新用户并登录. 一个例子如下: require 'spec_helper'describe "users" do describe "user registration" do it "should create a new user and log in" do # Register a new user to be used during the testi
我的问题是我必须为每个单独的水豚测试创建一个新用户并登录.

一个例子如下:

require 'spec_helper'

describe "users" do
  describe "user registration" do
    it "should create a new user and log in" do
      # Register a new user to be used during the testing process
      visit signup_path
      fill_in 'Email',with: 'testuser'
      fill_in 'Password',with: 'testpass'
      fill_in 'Password confirmation',with: 'testpass'
      click_button 'Create User'
      current_path.should == root_path
      page.should have_content 'Thank you for signing up!'
    end
  end

  describe "user login" do
    it "should log in" do

      # log in
      visit login_path
      fill_in 'Email',with: 'testpass'
      click_button 'Log In'
      current_path.should == root_path
      page.should have_content 'Logged in!'
    end
  end
end

登录测试失败,因为该测试的数据库中不再存在该用户.

这可以通过将两者都放在一个测试中来解决,但我认为这是不好的做法.

另外我还有另一个文件,目前正在使用before_do进行每次测试之间的注册和登录,这看起来也很糟糕……你can see that code here.

为了记录这是我的第一个rails应用程序,所以也许我试图以错误的方式做到这一点.我想尽可能地干掉它..

在需要用户登录的页面上使用capybara真的很糟糕吗?

解决方法

我这样做了.

require "spec_helper"

  describe "Users" do
     subject { page }
     describe "User Registration" do
        before { visit signup_path }

        let(:submit) { "Sign up" }

        describe "with invalid information" do
           it "should not create a user" do
             expect { click_button submit }.not_to change(User,:count)
           end
        end

        describe "with valid information" do
           before do
             fill_in "Email",with: "user@example.com"
             fill_in "Password",with: "foobar12"
             fill_in "Password confirmation",with: "foobar12"
           end

           it "should create a user" do
              expect { click_button submit }.to change(User,:count).by(1)
           end

           describe "after registration" do
             before { click_button submit }
             it { should have_content 'Thank you for signing up!' }
           end

           describe "after registration signout and login" do
              let(:user) { User.find_by_email('user@example.com') }
              before do
                click_button submit 
                visit signout_path
                sign_in user     # sign_in is a method which u can define in your spec/support/utilities.rb . Define once and use at multiple places.
              end
              it { should have_content 'Logged In!' }
              it { should have_link('Logout') }
           end
        end
     end    
   end

#spec / support / utilities.rb

def sign_in(user)
  visit sign_path
  fill_in "Email",with: user.email
  fill_in "Password",with: user.password
  click_button "Log in" 
end

你的每个describe和it块都会在parent之前的块之后运行,这就是为什么我们需要在上面测试用例中的每个块中click_button.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读