RSpec中带有Reform形式的匹配项“ validate_length_of”

时间:2019-04-09 05:24:18

标签: ruby-on-rails rspec shoulda reform

我正在为ReformRSpec宝石设置表单规格(使用Shoulda Matchers宝石)。我想弄清楚为什么会有验证问题。

我的实际配置:

  ruby '2.5.1'
  gem 'rails', '~> 5.2.0'
  gem 'rspec-rails', '~> 3.8'
  gem 'shoulda-matchers', '~> 4.0'
  gem 'reform-rails', '~> 0.1'

我已经在表单中尝试了各种长度验证。但是没有什么可以使事情变得更好。

这是用于测试的最小形式:

# frozen_string_literal: true

class UserForm < Reform::Form
  # == Properties  ==========================================================
  property :nickname


  # == Validations ==========================================================
  validates :nickname, presence: true, length: { minimum: 3, maximum: 100 } 
end

这是规格:

# frozen_string_literal: true

RSpec.describe UserForm, type: :model do
  subject { described_class.new(User.new) }

  it { is_expected.to validate_presence_of :nickname }
  it { is_expected.to validate_length_of(:nickname).is_at_least(3).is_at_most(100) }
end

请注意,validate_presence_of匹配器工作正常。

我的输出为RSpec

  1) UserForm should validate that the length of :nickname is between 3 and 100
     Failure/Error: it { is_expected.to validate_length_of(:nickname).is_at_least(3).is_at_most(100) }

       Expected UserForm to validate that the length of :nickname is between
       3 and 100, but this could not be proved.
         After setting :nickname to ‹"xxx"›, the matcher expected the
         UserForm to be valid, but it was invalid instead, producing these
         validation errors:

         * nickname: ["is too short (at least 3 characters)"]

我显然除了使这些类型的验证有效之外。

我希望可以在这里找到帮助:)

1 个答案:

答案 0 :(得分:0)

Reform is known not to work with shoulda-matchers。基本上,应当匹配器中的所有模型匹配器的工作方式如下:

  • 为被测类创建新实例。
  • 在该实例上设置属性。
  • 在该实例上调用validate
  • errors读取任何可能的验证错误。

但是,Reform doesn't work this way;您无需分别在表单对象上设置属性,然后调用valid?,使用要在表单对象上设置的属性调用validate,然后在验证过程中对这些属性进行验证组。因此,这很可能是您收到此错误的原因-因为shoulda-matchers尝试手动设置属性,然后validate将其删除。

不幸的是,如果不编写某种适配器的话,就没有一种方法可以使豆豆匹配器与Reform一起使用。我们不打算很快将其添加到gem中,但我们将采取PR!除此之外,显然the Reform team was talking about making some RSpec matchers本来应该是匹配者的精神,但是我不确定那里是否取得了很大进展。

对不起,我帮不上忙:/