5

私は遊んでいる Seaside アプリでテスト駆動開発を使用しており、すべてのデータは (データベースではなく) イメージ内のオブジェクトとして保存されています。

したがって、テストを実行するときは、次のように、実際のデータがテスト データで破棄される前に、慎重に保存する必要がありました。

ToDoTest>>setUp 
    savedTasks := Task tasklist.
    Task deleteAllTasks.

    savedProjects := ToDoProject projectlist.
    ToDoProject deleteAllProjects.

    savedPeople := Person peoplelist.
    Person deleteAllPeople.

と:

ToDoTest>>tearDown
    Task tasklist: savedTasks.
    ToDoProject projectlist: savedProjects.
    Person peoplelist: savedPeople

問題は、テストが失敗したときに発生します。もちろん失敗します。これにより、デバッガーがポップアップし、修正できますが、tearDown が常に呼び出されるとは限らないため、実際のデータを失う可能性があります。

私はデータをファイルに保存しているので、大きな問題ではありませんが、思ったほどスムーズでも自動化されていません。

とにかく私はこれを改善できますか?

4

2 に答える 2

6

問題を完全に解決するシナリオがあるかどうかはわかりません。本当の問題は、モデルがグローバルであることです。これは便利で素晴らしいことですが、このようなシナリオでは簡単に失敗します。したがって、モデルをグローバルなものからよりローカライズされたバリアントに変更して、本番データに干渉することなくテスト目的でのみモデルを作成できるようにすることを検討します。

現在のセットアップ内で修正するには、ensure: ブロックをどこかに追加する必要があります。ensure ブロックは、すべてが正常に行われたか、エラーが発生したかに関係なく、何かが実行されることを「保証」します。問題は、テストの前後にそれを行う必要があることです。

この場合、自分のテスト クラスの TestCase>>#runCase を次のように上書きします。

runCase
   [ self saveRealModel.
      super runCase ]
      ensure: [ self restoreRealModel ]
于 2013-04-29T09:46:54.130 に答える