単体テストの作成に関してはまだ初心者なので、どうすれば正しいのか頭を悩ませているケースによく遭遇します。計画されたデザインのテストを書いているときに、ふけを誘発するこれらのインスタンスの 1 つに出くわしました。私のデザイン:
ユーザーの入力に基づいて dataFetcherClass にメッセージを送信する 1 つの ViewController。(以下のコードは、罪のない人を保護するために変更されています)。
-(void) userPushedLocalBusinessButtons{
[_businessDataFetcher fetchLocalData];
}
-(void) userPushedWorldwideBusinessButtons{
[_businessDataFetcher fetchWorldwideData];
}
これらのアクションのデータ形式は同じです。これは、dataFetcher がその変更からデータを収集する場所です。したがって、BusinessDataFetcherClass には次のメソッドがあります。
-(void) fetchLocalData{
_dataAddress = @"localData.json";
[self fetchData];
}
-(void) fetchWorldwideData{
_dataAddress = @"worldwideData.json";
[self fetchData];
}
fetchData メソッドは非同期でデータをフェッチし、完了したら収集したデータとともに通知を送信します。ここで、fetchLocalData または fetchWorldwideData が実行されたときに ivar _dataAddress が変更されたことを確認する単体テストを作成したいと思います。
これは、コードを変更しないと明らかに不可能です。これは _dataAddress をパブリック プロパティにすることで簡単に解決できると言う人もいますが、それが 1 つの解決策です。もう 1 つの方法は、_dataAddress ivar の値を返すメソッドを作成することです。どちらの場合も、実際のコードベース自体の全体的な品質を向上させるのではなく、テストのためだけにコードを変更する必要があるため、どちらの選択肢にも完全に満足しているわけではありません。
私は 2 番目の選択肢にたどり着き、メソッド -(NSString *) dataAddress; を含めました。私の質問は (見出しで述べたように) これで問題ないのでしょうか? 私のデザインは問題ですか?TDD の最大の目標はリグレッションを回避することであることは明らかですが、コード全体の品質を向上させることも重要な目標であると考えています。時折毛羽立ちを追加することは予想されますか?