RSpec 如何使用 be_invalid 匹配器

问题描述 投票:0回答:1

我注意到以下行

expect(actual).to be_invalid

当我看着https://github.com/perfectline/validates_url/blob/81ec1516423af0b4fdc7cabbcda0089e434f2703/lib/validate_url/rspec_matcher.rb#L5

我试图在 rspec-core、rspec-expectations 和 rspec-rails gems 中寻找该匹配器的实现,但我只能找到

be_valid
并且也只能在 rspec-rails 中找到 https://rubydoc.info/gems/rspec -rails/RSpec%2FRails%2FMatchers:be_valid

这让我想知道

be_invalid
是如何可用的,因为当我在测试示例中使用该匹配器时,它没有引发任何未定义的方法错误。

有人可以帮我理解它是如何工作的吗?

谢谢。

rspec rspec-rails rspec-expectations
1个回答
0
投票

以问号结尾的方法称为谓词。它们看起来像这样:

[].empty?

RSpec 有一个非常酷的谓词匹配器,如下所示:

expect([]).to be_empty

它的工作原理是使用

method missing
选择
BePredicate
匹配器。匹配器的工作原理是使用正则表达式剥离
be_
并附加
?
,然后将该方法
send
应用于期望的主题。

be_valid
be_invalid
没有什么不同。
valid?
invalid?
都在 ActiveModel::Validations 上定义。

所以,如果你这样做:

expect(User.new).to be_invalid

RSpec 使用其谓词匹配器来调用

User.new.invalid?
并返回结果。
be_valid
也是如此。除非,也就是说,您使用的是
RSpec::Rails
,它包含一个
BeValid
匹配器,它会覆盖 RSpec 的谓词匹配器,以便它可以在规范失败时打印出所有验证错误。

© www.soinside.com 2019 - 2024. All rights reserved.