サーバーにデータを送信するためにサードパーティのフレームワークを使用しています。私はそのサードパーティのフレームワークをモックして、自分のコードがそれとどのように相互作用するかを分離してテストしています。これは、単体テスト中にネットワークからデータが返されるのを待つのを避けるためであり、作成したエラー処理コードをテストしたいためです。
私は OCMock などを使用していません。サードパーティのフレームワークをサブクラス化して、独自のモック オブジェクトを作成しています。
私の方法は次のようになります-
- (void)loginWithCredentials:(NSDictionary *)credentials
{
NSDictionary *credentials = [self credentials];
NSString *username = [credentials objectForKey:kUserCredintialUsername];
NSString *password = [credentials objectForKey:kUserCredintialPassword];
[ThirdPartyClass loginWithUsername:username
andPassword:password
block:^(ThirdPartyClass *user, NSError *error){
if (user) {
NSLog(@"We logged in");
}
else if (error) {
NSLog(@"%@", [error errorString]);
}
}];
}
私がやりたいことはloginWithUsername:andPassword:block:
、単体テストでモックを呼び出すことです。現在のメソッドは、明らかに、「教えて、尋ねるな」に従っていないため、テストできません (loginWithCredentials:
どのクラスを呼び出すかは伝えていませんloginWithUser...block:
)。これを解決するために考えられる唯一の方法は、クラス変数をインスタンスまたはクラスに追加するか、引数を追加してloginWithCredentials:
、モックを代用できるようにすることです。そうすることで、本番コードは明確になりません-すでにサードパーティ ライブラリへのアダプタとして記述されています。代わりに、メソッドをリファクタリングすることをお勧めしloginWithCredentials:
ます。