RSpec 中的应该匹配器 `validate_length_of` 具有改革形式
Shoulda matcher `validate_length_of` in RSpec with Reform form
我正在使用 RSpec
和 Shoulda Matchers
gem 为我的表单设置规范(使用 Reform
gem)。我无法弄清楚为什么我遇到验证问题。
我的实际配置:
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)"]
我显然不希望使这些类型的验证有效。
希望能在这里找到帮助:)
Reform is known not to work with shoulda-matchers。基本上,shoulda-matchers 中的所有模型匹配器都按以下方式工作:
- 正在测试 class 的新实例。
- 正在该实例上设置属性。
- 正在该实例上调用
validate
。
- 正在从
errors
读取任何可能的验证错误。
然而,Reform doesn't work this way;您不是单独在表单对象上设置属性然后调用 valid?
,而是使用要在表单对象上设置的属性调用 validate
,然后在被验证的过程中验证这些属性放。所以这可能就是您收到此错误的原因 — 因为 shoulda-matchers 正在尝试手动设置属性,然后 validate
将它们吹走了。
不幸的是,如果不编写某种类型的适配器,就无法让 shoulda-matchers 与 Reform 一起工作。我们不打算很快将其添加到 gem,但我们会进行 PR!除此之外,显然 the Reform team was talking about making some RSpec matchers 本着 shoulda-matchers 的精神,但我不确定在那里取得了多少进展,如果有的话。
抱歉,我不能提供更多帮助:/
我正在使用 RSpec
和 Shoulda Matchers
gem 为我的表单设置规范(使用 Reform
gem)。我无法弄清楚为什么我遇到验证问题。
我的实际配置:
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)"]
我显然不希望使这些类型的验证有效。
希望能在这里找到帮助:)
Reform is known not to work with shoulda-matchers。基本上,shoulda-matchers 中的所有模型匹配器都按以下方式工作:
- 正在测试 class 的新实例。
- 正在该实例上设置属性。
- 正在该实例上调用
validate
。 - 正在从
errors
读取任何可能的验证错误。
然而,Reform doesn't work this way;您不是单独在表单对象上设置属性然后调用 valid?
,而是使用要在表单对象上设置的属性调用 validate
,然后在被验证的过程中验证这些属性放。所以这可能就是您收到此错误的原因 — 因为 shoulda-matchers 正在尝试手动设置属性,然后 validate
将它们吹走了。
不幸的是,如果不编写某种类型的适配器,就无法让 shoulda-matchers 与 Reform 一起工作。我们不打算很快将其添加到 gem,但我们会进行 PR!除此之外,显然 the Reform team was talking about making some RSpec matchers 本着 shoulda-matchers 的精神,但我不确定在那里取得了多少进展,如果有的话。
抱歉,我不能提供更多帮助:/