0

我正在使用和gems 为我的表单(使用Reformgem)设置规范。我无法弄清楚为什么我会遇到验证问题。 RSpecShoulda 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)"]

我显然不打算让这些验证工作。

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

4

1 回答 1

0

众所周知,改革不适用于 shoulda-matchers。基本上, shoulda-matchers 中的所有模型匹配器都通过以下方式工作:

  • 制作被测类的新实例。
  • 在该实例上设置属性。
  • 调用validate那个实例。
  • 从中读取任何可能的验证错误errors

然而,改革不是这样运作的;您不会单独在表单对象上设置属性然后调用valid?,而是validate使用要在表单对象上设置的属性进行调用,然后在设置过程中验证这些属性。所以这可能就是您收到此错误的原因 - 因为 shoulda-matchers 正在尝试手动设置属性,然后validate将它们吹走。

不幸的是,没有办法让 shoulda-matchers 在不编写某种适配器的情况下与 Reform 一起工作。我们不打算很快将其添加到 gem 中,但我们会进行 PR!除此之外,显然改革团队正在讨论本着应该匹配器的精神制作一些 RSpec 匹配器,但我不确定那里取得了多少进展,如果有的话。

对不起,我不能更有帮助:/

于 2019-04-10T04:30:46.300 回答