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