我注意到以下行
expect(actual).to be_invalid
我试图在 rspec-core、rspec-expectations 和 rspec-rails gems 中寻找该匹配器的实现,但我只能找到
be_valid
并且也只能在 rspec-rails 中找到 https://rubydoc.info/gems/rspec -rails/RSpec%2FRails%2FMatchers:be_valid
这让我想知道
be_invalid
是如何可用的,因为当我在测试示例中使用该匹配器时,它没有引发任何未定义的方法错误。
有人可以帮我理解它是如何工作的吗?
谢谢。
以问号结尾的方法称为谓词。它们看起来像这样:
[].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 的谓词匹配器,以便它可以在规范失败时打印出所有验证错误。