ruby-on-rails - 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
我怎样才能重用那段代码,所以当我测试另一个需要用户登录的操作时,我之前使用更干燥的代码来完成所有这些操作。提前致谢!
解决方案
您可以使用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
您可以设置多个用户和其他工厂……但是那里有大量示例,因此我不会全部介绍。
注意:如果目的是测试填写表单和登录的用户流程,我会将测试保留在您的问题中。但是,对于所有其他测试,我提出的方法应该很好地为您服务并且很多清洁器。
推荐阅读
- java - Thymeleaf 的形式不将对象返回给控制器类的方法
- python - Python 使用 ssl.PROTOCOL_TLSv1_1 和密码“RC4-SHA”创建 SSL 连接失败并出现错误:sslv3 警报握手失败 (_ssl.c:1108)
- javascript - 如何将信息从一个函数传递到另一个函数
- c++ - 在函数返回中将 A 类的指针转换为 B 类,当 B 具有带有 `A*` 的构造函数时
- javascript - 了解 JavaScript 调用函数的行为
- r - 将网格化气候数据插值到 R 中的不同分辨率
- ruby-on-rails - 在任何来源中都找不到 uniform_notifier-1.13.0
- html - 位置固定时图像大小发生变化
- css - 当前在 Webpack 中处理 CSS 条目文件的最佳方法是什么?
- sql-server - 为“使用 [数据库]”使用动态值