4

Rspecでテストする方法を学ぼうとしています。

現時点では、Item クラスの仕様があります。

require 'spec_helper'

describe Item do
  it { should belong_to :list }

  before(:each) do
    @item = FactoryGirl.create(:item)
  end

  subject { @item }

  it { should respond_to :name }
  it { should validate_presence_of :name }

end

ただし、これについていくつか質問があります。

it { should validate_presence_of :name }書くのと同じです:

describe "when name is not present" do
  before { @item.name = "" }
  it { should_not be_valid }
end

または、両者の間に決定的な違いはありますか?

it { should belong_to :list }また、仕様に書く価値があるかどうか、またはこれのためのより良い方法があるかどうかも疑問に思っていました.

@item = FactoryGirl.build(:item)またはができることも知っていますFactoryGirl.create(:item)。create は項目を test db に保存しますが、build は保存しませんか? それとも私はここで混乱していますか?いつどれを使用する必要がありますか?

ありがとう。

4

1 に答える 1

8

shoulda-matchersまたは同様のものを使用していると思います。彼らには、あなたが使用したように、短くて簡潔なマッチャーを提供するという利点があります (私は思います)。

個人的には、次のテストを信じています。

it { should belong_to :list }
it { should validate_presence_of :name }

ほとんどの場合、私のクラスは次のようになるため、重要です。

class Item
  belongs_to :list
  validate_presence_of :name
end

誰かがこれらの行のいずれかを変更すると、テストに表示されます。

したがって、彼らは確かに仕様を書く価値があり、それも大した仕事ではありません。

第二に、はい、should validate_presence_of確かに大きな形式に似ていますが、短い形式の方がはるかに表現力があると思います. ショートフォームを使用してください!

第三に: FactoryGirl の違い:

  • オブジェクトがデータベースに存在する必要がある場合に使用FactoryGirl.createします。たとえば、コントローラーが項目を取得できることをテストする場合などです。
  • FactoryGirl.buildオブジェクトのみが必要で、オブジェクトがデータベースに存在する必要がない場合に使用します。オブジェクトをデータベースに保存しないと、テストが速くなります。

お役に立てれば。

于 2012-08-12T17:22:52.497 に答える