2009-05-03 15 views
3

ネットワークを使用するコードをテストしたい(具体的にはNSURLConnectionクラス)。私はネットワーキングを取り除くしたいユニットテストでNSURLConnectionによるユニットテスト

- (id) buildConnection 
{ 
    // some more code and then: 
    return [NSURLConnection …]; 
} 

- (void) startNetworkSync 
{ 
    id connection = [self buildConnection]; 
    //… 
} 

、すなわち:コードは(のはNetworkManagerそれを呼びましょう)ビットのようになります。 NSURLConnectionオブジェクトをモックで置き換えてください。これはどうすればいいですか?

buildConnectionメソッドをスタブで置き換えるNetworkManagerの部分モックを作成しようとしました。問題は、OCMockによって行われた部分的なモックが、外部からのスタブメッセージのみであることです。startNetworkSyncからbuildConnectionを送信すると、スタブではなく元のメソッドが呼び出されます。

私はまた、カテゴリを通じてNetworkManagerクラスをサルでパッチしてみました。これはうまくいけば、他のコードでbuildConnectionメソッドを簡単にオーバーライドし、NSURLConnectionをスタブに置き換えることができます。問題は、テストでスタブ接続を取得する簡単な方法がないことです。接続はNetworkManagerのプライベートな部分です。

次に、NetworkManagerをサブクラス化し、buildConnectionメソッドをオーバーライドし、インスタンス変数と作成された接続のアクセサーを追加します。しかし、これはたくさんのコードのようです。

どうすれば解決できますか?私は、NetworkManagerクラスのデザインをきれいに保ち、多くの魔法やテストで多くのコードを必要としないソリューションを探しています。

答えて

3

これは、依存性注入が解決するように設計されたものです。代わりにstartNetworkSyncWithConnection:(NSURLConnection*)を使用すると、モック接続でメソッドを簡単にテストできます。あなたのクライアントのAPIを変更したくない場合は、を引数として[self buildConnection]という新しいメソッドを呼び出すだけのラッパーにしておくこともできます。

+0

OK、私は多かれ少なかれこのようにしました。クライアントはネットワークについては何も知らず、データの送受信しか行いませんが、テストに役立つ「外部」接続をプロセスに追加する方法を追加しました。ありがとう。 – zoul

+0

@zoul、あなたの解決策のコードを貼り付けてください。ありがとう! – ma11hew28

2

実際の部分モックをサポートするようにOCMockを修正しました。repo on GitHubを参照してください。

+0

ありがとうございます。私はすでに問題を解決しましたが、実際の部分的なモックは便利です。コードをバニラOCMockとマージする可能性はありますか? – zoul

+0

はい、OCMockの作成者がマージ処理中です。彼は併合の間にそれをもっときれいにしようとします。 –

+0

これはまだ統合されていますか?もしそうなら、これを行う方法の例を提供してください。 – ma11hew28

0

私が最近使用した別の解決策は、ネットワーキングインターフェイスを完全に抽象化することです。クラスがネットワークからいくつかのデータを必要とする場合、それはおそらく明示的にプロトコルとしてモデル化することができるいくつかのサーバーのサービスと対話:

@protocol SomeNetworkService 
- (NSArray*) allAvailableFoos; 
- (void) insertNewFoo: (Foo*) foo; 
@end 

そして、あなたは本当のHTTPの実装とテスト1を持っています。これは、より多くの作業を意味しますが、テスト容易性もはるかに優れています。テストネットワークレイヤーは、必要なものを実行できるので、テストは脆弱ではなく、はるかに便利です。

関連する問題