私は自分のプロジェクトに単体テストを追加し、テスト駆動型の方法で開発を続けることにしました。現在、ManageSieveクライアントオブジェクトの単体テストの実装に取り組んでいますが、その獣をテストするための最良の方法がわかりません。
私SieveClient
のオブジェクトは、ネットワーク通信のために他の2つのオブジェクトに依存しています。1つは、認証メソッドを処理するためのCyrusSASLライブラリのラッパーであるCocoaAsyncSocket
自分のオブジェクトです。SaslConn
テストのために、それらをモックオブジェクトに置き換える必要があります。これにはOCMockフレームワークを使用します。SieveClientオブジェクトはそれらのオブジェクト自体を作成する必要があるため、これを行う方法はよくわかりません。現在、そのオブジェクトの(プライベート)セッターを上書きして、常にOCMockspartialMockForObject:
メソッドを使用してモックオブジェクトをインストールしています。しかし、これは私には正しくないと感じています。これをよりよく解決する方法はありますか?
私が問題を抱えている他の部分は、ソケット自体です。プロトコルの詳細をテストできるようにするには、ソケットから事前定義されたテストデータを返す方法が必要です。OCMockメカニズムを使用して、ソケットからの戻り値を偽造することができると思います。しかしCocoaAsyncSocket
、ソケットからデータを読み取るためのさまざまなメソッドが提供されているため、プロトコルオブジェクトによってどの順序で使用されているかを正確に知る必要があります。単体テストをプロトコルオブジェクトの実装の詳細に依存させたくありません。だから私はここで何をすべきですか?ソケットクラスのモックオブジェクトを手動で実装しますか?これは些細なことではないように思われるので、おそらくそのための単体テストも必要になるでしょう。それはいい考えですか?
何かをテストするのが難しい場合、それもおそらくあまりうまく設計されていないことを私は読んだ。しかし、難しいのは私がしなければならないソケットとの相互作用にあるので、どうすればもっとうまくできるかわかりません。
コードを確認したい場合は、Bitbucket:SieveClient.mおよびSieveClient.hで見つけることができます。
編集:依存性注入
だから私は依存性注入について読みました、そして私はこれを使ってAsyncSocket
とSaslConn
オブジェクトを私のSieveClient
オブジェクトに入れるつもりだと思います。これらのオブジェクトを受け入れて使用するようにコンストラクターを変更します。このクラスのユーザーは通常、ソケットとSASLオブジェクトを気にしないので、これらのオブジェクトを作成してコンストラクターに渡すだけのファクトリメソッド(コンビニエンスコンストラクターの形式)を追加します。
しかし、これは私のテスト問題の最初の(そしてより簡単な)部分だけを解決します。