2

我正在阅读 RSpec,在第一个示例中,我看到如下内容:

Class Foo  # in the model

attr_accessible :name, :phone , etc#....

validates :name, presence: true
validates :phone, presence: true

然后在 RSpec 我看到像

it "is valid with a name" do
  foo = Foo.new (name: "blah")
  expect(foo).to be_valid
end

所以我想我的困惑是这个 be_valid 在做什么?它怎么知道名字是有效的?be_valid 是否意味着去检查我们是否为我们的模型定义了验证器,去看看是什么?在这种情况下,我们说 name 应该存在,所以现在我们已经传递了 name,这意味着它是有效的?

4

2 回答 2

3

be_*matcher 是 rspec 的技巧之一。当你说

foo.should be_valid

rspec 将调用valid?方法foo并检查其返回值。valid?方法(在您的 ORM 中定义)反过来会调用您的验证器。

简而言之,be_valid对验证器一无所知。这是一个通用的机制。

于 2013-02-23T16:03:08.990 回答
0

如上所述, foo.should be_valid 只是调用 foo.valid?。由于 Foo 模型继承自 ActiveRecord::Base,并且 ActiveRecord::Base 包括其 ActiveRecord::Validations 模块,该模块本身又包括模块 ActiveModel::Validations (其中定义了 valid? 方法),您的 Foo 类立即也可以访问此方法。

你能找到关于有效的信息吗?方法在这里:api.rubyonrails.org/classes/ActiveRecord/Validations.html#method-i-valid-3F

于 2013-02-23T23:15:20.067 回答