1

メソッドをテストするための仕様を書いていdown_voteます。しかし、これをテストするには、データベースに既存の投票のエントリが必要です。したがって、私の仕様は次のようになります。

describe "down_vote" do
  it "lowers vote count" do
    video = Factory.create(:video)
    user = Factory.create(:user)
    vote = Factory.vote(:vote, :voter_id => user.id, :voteable_id => video.id)

    expect do
      user.down_vote(video)
    end.to change{ Vote.count }.by 1
  end
end

このようなスペック/テストを書いて大丈夫ですか?あまり慣れていないセットアップがたくさんあるようですが、それをテストする他の方法は本当にわかりません。

4

2 に答える 2

1

私はします:

let(:video) { Factory.create(:video) }
let(:user)  { Factory.create(:user)}
let(:vote)  { Factory.vote(:vote, :voter_id => user.id, :voteable_id => video.id)}
describe "down_vote" do
  it "lowers vote count" do
    vote # or use let! To have the vote created directly
    expect do
      user.down_vote(video)
    end.to change{ Vote.count }.by 1
  end
end

仕様letの範囲外であると、それらは再利用可能になります

于 2012-06-03T09:37:18.260 に答える
0

仕様が意図したとおりに機能すると仮定すると、DRYの原則に違反しない限り、個々のテストブロック内でファクトリを使用しても問題はありません。多くのテストで同じオブジェクトを参照する場合は、RSpecletまたはbeforeブロックを使用してファクトリオブジェクトをインスタンス化することをお勧めします。

また、「ファクトリの使用」と「アソシエーション」に関するfactory_girlのドキュメントのセクションを読んで、特定のテストで次のことができるかどうかを確認することもできます。

  1. データベースへの書き込みを回避するには、#createの代わりに#buildを使用します。
  2. #associationを活用して、ファクトリが関連付けられたレコードを暗黙的に構築/作成できるようにします。

経験則として、関連するテストブロック内でテスト固有のセットアップを実行することは問題ありません。重要なことは、同じデータを手動でエラーが発生しやすい方法で繰り返し設定しないようにすることです。

于 2012-06-03T12:35:06.193 に答える