介绍

在现场我使用 Rspec 编写测试代码。
当我在测试模型时与我的上级检查需求时,我被告知“使用Shouda Matchers很容易”。
你首先在读什么?还有什么好吃的?
我一边思考一边研究它,所以我将它作为备忘录留下。
请随时指出任何错误或遗漏。

环境(我的电脑)

红宝石 2.7.1
导轨 6.0.5

什么是应达匹配器?

Shoulda Matchers 是一个 gem,它允许您在单行中编写冗长、复杂和磕磕绊绊的测试代码。这是一条线,所以它是一条线。
e?你能做到吗?我不这么认为。
我决定实际尝试一下以消除我的怀疑。
(补充)
当我查到它时,它似乎被读作“Shurda Matchers”。
它看起来像瑞典语,在日语中翻译为“应该匹配”。

先决条件

* 假设已经安装了 Rspec。

准备模型

创建一个这样的模型:
Rails RspecのテストをShoulda Matchersで簡単に書く
像这样向您的模型添加验证:

  • 无法使用空标题注册
  • 最多只能注册 255 个字符
工具.rb
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 的末尾。

规范/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描述方式,我想会如下,虽然有细微差别。

tool_spec.rb
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 

Rails RspecのテストをShoulda Matchersで簡単に書く
测试成功通过。

尝试应该匹配器

让我们使用 Shoulda Matchers 编写测试代码。

tool_spec.rb
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。
验证结果如下图所示。
Rails RspecのテストをShoulda Matchersで簡単に書く

引起我注意的点

有两件事困扰着我个人。

  • 通过查看测试代码和验证结果很难理解你在做什么(可读性)
  • 好像开发已经结束了,但是引入会有影响吗?

如果有人知道一个好的解决方案,请告诉我。

综上所述

我能够使用 Shoulda Matchers 编写简单而简短的测试。
如果您设计更多使用它的方法,它似乎可以在任何情况下使用。
我想了解更多。

参考


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308622240.html

相关文章: