代码之家  ›  专栏  ›  技术社区  ›  Ronan Lopes

rspec/capybara:设置一个经常调用的例程

  •  0
  • Ronan Lopes  · 技术社区  · 6 年前

    我对Rspec和Capybara的测试很陌生。我在我的应用程序上使用design进行身份验证,我必须使用一个操作来登录我的大部分测试。我目前有一个这样的登录测试:

    before do
            @john = User.create!(name: "John", email: "john@example.com", password: "password")
    end
    
    scenario "with valid credentials" do
    
            visit "/"
    
            fill_in "Email", with: @john.email
            fill_in "Password", with: @john.password
            click_button "Log in"
    
            expect(page).to have_content("Signed in successfully")
            expect(page).to have_content("Welcome, #{@john.name}")
            expect(page).not_to have_link("Sign up")
            expect(page).to have_link("Sign out")
    
    end
    

    我如何重用这段代码,所以当我测试另一个需要用户登录的操作时,我会用一个干燥剂代码来完成所有这些操作。事先谢谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mark Merritt    6 年前

    你可以用 Warden test helpers 随着 FactoryBot 彻底清理你的测试。由于您已经安装了designe,所以要包含Warden测试助手,您只需将其添加到您的spec/rails_helper.rb中即可。

    include Warden::Test::Helpers
    Warden.test_mode!
    

    这样你就可以简单地叫…

    before do
      @john = FactoryBot.create(:user)
      login_as(@john, :scope => :user)
    end
    

    然后简单地注销…

    logout(@john)
    

    设置用户工厂(即 :user 来自 FactoryBot.create(:user) 在整个测试中易于设置和重用。 一旦你安装了工厂的_Bot_Rails gem,你就可以创建一个名为factures的目录和一个名为users.rb…(spec/factures/users.rb)的文件,然后用你的特定用户属性添加类似这样的内容…

    FactoryBot.define do
      factory :user do
        first_name "John"
        last_name  "Doe"
        email "johndoe@example.com"
        password "helloworld"
        password_confirmation "helloworld"
      end
    end 
    

    你可以建立多个用户和其他工厂……但是这里有很多例子,所以我不想谈这些。

    注意:如果测试的目的是测试填写表单和登录的用户流,我会将测试保留在您的问题中。但是,对于所有其他的测试,我设计的方法应该很好地为您服务,并且更干净。