介绍
在现场我使用 Rspec 编写测试代码。
当我在测试模型时与我的上级检查需求时,我被告知“使用Shouda Matchers很容易”。
你首先在读什么?还有什么好吃的?
我一边思考一边研究它,所以我将它作为备忘录留下。
请随时指出任何错误或遗漏。
环境(我的电脑)
红宝石 2.7.1
导轨 6.0.5
什么是应达匹配器?
Shoulda Matchers 是一个 gem,它允许您在单行中编写冗长、复杂和磕磕绊绊的测试代码。这是一条线,所以它是一条线。
e?你能做到吗?我不这么认为。
我决定实际尝试一下以消除我的怀疑。
(补充)
当我查到它时,它似乎被读作“Shurda Matchers”。
它看起来像瑞典语,在日语中翻译为“应该匹配”。
先决条件
* 假设已经安装了 Rspec。
准备模型
创建一个这样的模型:
像这样向您的模型添加验证:
- 无法使用空标题注册
- 最多只能注册 255 个字符
class Tool < ApplicationRecord
validates :title, presence: :ture, length: { maximum: 255 }
end
安装应该匹配器 gem
在 Gemfile 中写入以下内容并捆绑安装。
group :development, :test do
# ここから追記----------------------------ーーーーーーーーーーーーーーー
gem 'shoulda-matchers',
git: 'https://github.com/thoughtbot/shoulda-matchers.git',
branch: 'rails-5'
# ここまで追記----------------------------ーーーーーーーーーーーーーーー
end
将以下内容添加到 spec/rails_helper.rb 的末尾。
# 省略
RSpec.configure do |config|
# 省略
end
# ここから追記----------------------------
Shoulda::Matchers.configure do |config|
config.integrate do |with|
with.test_framework :rspec
with.library :rails
end
end
# ここまで追記----------------------------
您现在可以出发了。
*您可能无法安装 Shoulda Matchers gem,并且可能会出现如下错误。 (我曾是)
NoMethodError: undefined method `new' for BigDecimal:Class
当我参考这篇文章更新 gem 时效果很好,所以请尝试一下。
实际尝试
我想验证以下三点。
- 如果标题为空,则无法注册
- 如果标题在255个字符以内,可以注册
- 如果标题超过 256 个字符,则无法注册
现在让我们用普通的 Rspec 来编写它。
常规 Rspec
如果是正常的Rspec描述方式,我想会如下,虽然有细微差别。
require 'rails_helper'
RSpec.describe Tool, type: :model do
describe 'tool' do
before do
@tool = Tool.new(title: "シャープペンシル")
end
it '空文字の場合、登録できないこと' do
@tool.title = ""
@tool.valid?
expect(@tool.errors[:title]).to include("can't be blank")
end
it '255文字の場合、登録できること' do
@tool.title = "あ"*255
expect(@tool).to be_valid
end
it '256文字の場合、登録できないこと' do
@tool.title = "あ"*256
@tool.valid?
expect(@tool.errors[:title]).to include("is too long (maximum is 255 characters)")
end
end
end
让我们运行测试。
bundle exec rspec spec/models/tool_spec.rb
测试成功通过。
尝试应该匹配器
让我们使用 Shoulda Matchers 编写测试代码。
require 'rails_helper'
RSpec.describe Tool, type: :model do
describe 'tool' do
it { is_expected.to validate_presence_of :title }
it { is_expected.to validate_length_of(:title).is_at_most(255) }
end
end
它可以非常令人耳目一新。
我很确定它可以写成单行。
it { is_expected.to validate_presence_of :title }
这是验证它是否为空的测试代码。
it { is_expected.to validate_length_of(:title).is_at_most(255) }
这是验证字符数是否正确的测试代码。
通过使用 Shoulda Matchers,最多可以测试 255 个字符和超过 256 个字符的测试。
此外,您不再需要先在前面创建@tool。
验证结果如下图所示。
引起我注意的点
有两件事困扰着我个人。
- 通过查看测试代码和验证结果很难理解你在做什么(可读性)
- 好像开发已经结束了,但是引入会有影响吗?
如果有人知道一个好的解决方案,请告诉我。
综上所述
我能够使用 Shoulda Matchers 编写简单而简短的测试。
如果您设计更多使用它的方法,它似乎可以在任何情况下使用。
我想了解更多。
参考
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308622240.html