RSpec/Capybara: 设置一个不断调用的例程

RSpec/Capybara: Setting a routine constantly called

我对 rspec 和水豚的测试真的很陌生。我在我的应用程序上使用 devise 进行身份验证,我将不得不使用一个操作来登录我的大部分测试。我目前有这样的登录测试:

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

我怎么能重用那段代码,所以当我测试另一个需要用户登录的操作时,我之前用干燥器代码做了所有这些。提前致谢!

您可以使用 Warden test helpers along with 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 后,您可以创建一个名为 factories 的目录和一个名为 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 

您可以设置多个用户和其他工厂...但是有大量示例,所以我不会一一列举。

注意:如果目的是测试填写表单和登录的用户流程,我会将测试保留在你的问题中。但是,对于所有其他测试,我提出的方法应该对你有用好吧,要干净得多。