首页 > 解决方案 > RSpec/Capybara:设置一个经常调用的例程

问题描述

我对使用 rspec 和 capybara 进行测试真的很陌生。我在我的应用程序上使用设计进行身份验证,我必须使用一个操作来登录我的所有测试。我目前有这样的登录测试:

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

我怎样才能重用那段代码,所以当我测试另一个需要用户登录的操作时,我之前使用更干燥的代码来完成所有这些操作。提前致谢!

标签: ruby-on-railsrspeccapybara

解决方案


您可以使用Warden 测试助手FactoryBot来显着清理您的测试。由于您已经安装了 Devise,您需要做的就是包含 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)很简单,可以在整个测试中重复使用。安装 factory_bot_rails gem 后,您可以创建一个名为 factory 的目录和一个名为 users.rb 的文件...(spec/factories/ 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 

您可以设置多个用户和其他工厂……但是那里有大量示例,因此我不会全部介绍。

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


推荐阅读