2013-04-27 10 views
5

私は遊んでいたシーサイドアプリでテスト駆動開発を使用していましたが、私のすべてのデータは(データベースではなく)イメージにオブジェクトとして格納されています。Smalltalk 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が必ず呼び出されるわけではないので、私は実際のデータを失うことがあります。

私はデータをファイルに保存するので、大きな問題ではありませんが、滑らかで自動化されたものではありません。

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

答えて

6

問題を完全に解決するシナリオがあるかどうかはわかりません。実際の問題は、モデルがグローバルであることです。それは便利でいいですが、そのようなシナリオでは簡単には失敗します。だから私はモデルをグローバルなものからよりローカライズされたものに変えることを考えています。そのため、生産データに干渉することなくテスト目的のためだけにモデルを作成することができます。

現在の設定で修正するには、どこかにsure:ブロックを追加する必要があります。確実なブロックは、すべてがうまくいくかエラーが発生しても何かが実行されることを「保証」します。問題は、テストの前後に行う必要があることです。この場合

私はそれは素敵なテスト匂いだ、

runCase 
    [ self saveRealModel. 
     super runCase ] 
     ensure: [ self restoreRealModel ] 
+0

興味深い。私は何らかの方法でデータを分割するというアイデアがここで助けになると思います。たとえば、私の単純なto-doアプリには現在ユーザーの概念がないので、これを追加して単体テスト用のテストユーザーを作成することができます。 –

+0

それを行う方法はたくさんあります。データを簡単にローカライズしたい場合は、クラスサイドからインスタンスサイドに移動することです。 ToDoProjectがメインクラスの場合は、クラスサイドのメソッドをインスタンス側に移動します。あなたはToDoProject >>#taskList、ToDoProject >>#projectList、... ToDoProjectクラス>>#defaultがあなたの実際のデータでToDoProjectインスタンスを返すように、最初のステップでToDoProjectをシングルトンにすることができます。あなたの海辺のコンポーネントには、instVarの "プロジェクト"があります。次に、本当の使用のために "ToDoProject default"でコンポーネントを設定し、 "ToDoProject new"をテストするために、 –

2

ああのようなものを使用して独自のテストクラス内のTestCase >>#のrunCaseを上書きします。 Norbert氏は、テストしたモデルがおそらくグローバルではないはずであることを指摘しています。ほとんどのテストは、個々のオブジェクト間の相互作用に基づいて行われる必要があります。 は、ストーリーボードでは、ユーザーのエントリポイントとしてクラスinstancevarユーザーと

DEUser subclass: #SBUser 
    instanceVariableNames: 'email initials projects invitations' 
    classVariableNames: '' 
    poolDictionaries: '' 
    category: 'StoryBoard-Data' 

を持っています。プロジェクトはユーザーからのみアクセス可能です。

users 
    ^users ifNil: [ users := OrderedCollection with: (SBAdministrator new 
     userid: 'admin'; 
     password: 'admin'; 
     yourself) 
    ] 

し、それらに

resetUsers 
    " SBUser resetUsers " 
    users := nil 

をクリアする方法多くの場合、私たちは、ドメインの作成時に依存関係に渡すことができますが

Iteration>on: aProject 
    ^self new 
     project: aProject; 
     yourself 

これは、(テストケース自体に合格することを可能にするか、別のオブジェクトモック)オブジェクト

関連する問題