2016-03-31 3 views
1

まず、この質問は意見に迷惑をかけるかもしれませんが、質問するのは貴重な質問だと思います。私は不在管理と追跡を扱う私のアプリケーションのための非常に具体的な例を与えるでしょう。RSpecを使用してRailsで複雑な関係をテストするにはどうすればよいですか?

Accountは、多くはUsersであり、Userは多くがAbsencesです。 AccountPublicHolidaysを作成することができます。これは、Absenceが使用する日数を計算する際に無視する必要があります。

例:人は週を脱ぐ場合は、使用日は、当時の一つがPublicHolidayある場合は、使用日は、私は、このような、そのメソッドを実装したい4.

だろう5.なりますPublicHolidayが作成された場合、作成日より前に作成されたAbsencesに使用され、PublicHolidayの日付をまたぐ日数が再計算されます。 absenceはそう私が開始する1日を計算するためにそれを期待して、私は後に使用するとphが同じ日付で、この試験では

it 'triggers a recalculation of absence days on create for absences created before the date of creation of the public holiday' do 
    robin = FactoryGirl.create(:robin) 
    absence = FactoryGirl.create(:basic_absence, user: robin) 
    expect(absence.days_used).to eq(1) 
    ph = FactoryGirl.create(:public_holiday, country: "England", account: robin.account) 
    expect(absence.reload.days_used).to eq(0) 
end 

私の現在のRSpecのテストでは、このようになります使用された日を再計算するコールバックを作成します。

このテストは正しい方法ですか?多くの関連オブジェクトを作成せずに効率的な方法がありますか?

+0

私の前提は、ユーザーが休暇(祝日を含む)がなくなるたびに、新しい休務記録が作成されることです。あなたがdays_used = absences - holidaysと言ったので、休暇モデルではなく、代わりにUserモデルの一部として 'days_used'メソッドを置く方が良いでしょうか?私は何かを誤解しない限り、@ absence.days_usedの代わりに@ user.days_usedのようなことをすると思います。 –

+0

ユーザーモデルでdays_usedと同様の方法があります。不在が何日使用されているか、論理がかなり複雑なので、私はそれを動かしたくありません。 –

+0

明示的に日付を 'ph = FactoryGirl.create(:public_holiday、country:" England "、account:robin.account、created_at:absence.created_at)'と明記するのとは別に、(また、真夜中にテストが失敗しないでください)、私はそのテストが健全だと思います。 –

答えて

2

まず、ローカル変数の代わりにletを使用することをお勧めします。次に、各テストでテストするテストが1つだけになるようにテストを分割します。第三に:

:テストのためのコンテキストを設定何かが

例えば(そのコンテキストで一つだけの試験があります場合でも)コンテキストブロックに配置する必要があり、ここにあなたのスペックの再書き込みに標準的な方法です

let(:robin) { FactoryGirl.create(:robin) } 
let(:absence) { FactoryGirl.create(:basic_absence, user: robin) } 


context "with no public holidays" do 
    it 'counts the absence day to be a day used' do 
    expect(absence.days_used).to eq(1) 
    end 
end 

context "with a public holiday for the absence" do 
    before do 
    FactoryGirl.create(:public_holiday, country: "England", account: robin.account) 
    end 
    it 'does not consider the absence day to be a day used' do 
    expect(absence.days_used).to eq(0) 
    end 
end 
+1

ようこそありがとうございました。 –

関連する問題