be_valid匹配器如何知道某些内容实际上是有效的

时间:2013-02-23 15:59:36

标签: ruby rspec

我正在阅读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意味着去检查我们是否为我们的模型定义了验证器,去看看有什么作用?在这种情况下,我们说名称应该存在,所以现在我们已经通过了名称,这意味着它是有效的吗?

2 个答案:

答案 0 :(得分:3)

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

foo.should be_valid

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

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

答案 1 :(得分:0)

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

您可以找到有效的信息吗?方法:api.rubyonrails.org/classes/ActiveRecord/Validations.html#method-i-valid-3F