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 は、モデルのバリデーターが定義されているかどうかを確認し、何が行われているかを確認することを意味しますか? この場合、名前が存在する必要があると言ったので、名前を渡したので、それは有効であることを意味しますか?

4

2 に答える 2

3

be_*matcher は rspec のトリックの 1 つです。あなたが言う時

foo.should be_valid

rspec はvalid?on メソッドを呼び出し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 に答える