0

私の「通知」モデルにはメソッドがあります(通知モデルと連絡モデルの両方があり、多くに属しています):

`def self.update_contact_association(contact, notification)
     unless contact == nil
         notification.contacts.clear
         c = Contact.find(contact)
         notification.contacts << c
     end
 end`

特定の通知と連絡先の間の関連付けを更新します。通知オブジェクト (行) と連絡先 ID のリストを取ります。単一の連絡先 ID 1 と 4 の更新の ID を持つ通知が与えられた場合、このメソッドは正常に機能し、テーブルは次のようになります。

notification_id    contact_id

4                  1

このメソッドを適切にテストするために単体テストを作成しようとすると、問題が発生します。これまでのところ、私は持っています:

'test 'update_contact_association' do
     notification = Notification.find(4)
     contact = Contact.find(1)
     Notification.update_contact_association([contact.id], notification)
'end

テスト メソッドを実行してもエラーは発生しませんが、テスト データベースは上記の例のように更新されず、単に空白になります。コントローラーが行っていることを模倣するには、保存または更新メソッドを使用する必要があると確信していますが、その方法はわかりません。アサーションを記述できるように、テーブルを適切に更新する単体テストが必要なだけです。これと非常に似ている/同じであるいくつかの方法をテストする必要があるため、どんなアイデアでも大歓迎です。

4

1 に答える 1

0

テストは通常​​、トランザクション内でデータベース クエリを実行し、各テストが終了するとそのトランザクションをロールバックします。これにより、テストが完了するとデータベースが空になります。

これは、各テストの開始点を元のままにし、テストが相互に依存しないようにするためです。単体テストは分離して実行することになっているため、常に同じデータベース/環境の状態から開始する必要があります。また、可能な限り最小限のコードで実行されるため、コードの相互作用について心配する必要はありません (まだ!)。

コードの相互作用について心配する準備ができたら、統合テストを構築したいと思うでしょう。それらはより長く、コードの複数の領域に触れ、入力の可能な組み合わせごとに実行されるため、できるだけ多くのコード行に触れます (これがコード カバレッジのすべてです)。

だから、空白なのは当たり前。メソッドを実行した後、いくつかの条件をアサートする必要がありますupdate_contact_association。これにより、データベースが期待どおりの状態にあり、そのメソッドの結果が期待どおりであることが示されます。

于 2013-09-10T00:57:38.280 に答える