1

私は iOS アプリを開発しており、テスト駆動開発でそれをやろうとしています。私はこのテーマについて多くのことを読んできましたが、で出会ったことの 1 つは、テストは高速で、繰り返し可能で、信頼できるものであるべきだということです。結果として、ネットワーク コードのテストを作成するときは、ネットワークの可用性に関係なく実行できるように、テストでネットワークを「シミュレート」する必要があります。

私のコードには、URL を使用してインターネットから画像を取得し、スケーリングして、NSData の dataWithContentsOfURL を使用してファイル システムに保存するメソッドがあります。

+ (void) getImage:(NSString *)imageUrl {

    UIImage *image = [UIImage imageWithData:
        [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]]];

    // Scale image
    // Save image in storage 
}

私の質問は、ネットワーク障害の可能性を考慮せずに、コードが正しい場合にテストに合格し、そうでない場合に失敗するように、このメソッドをテストするための良いアプローチは何でしょうか?

現在、私のテストでは、メソッドに接続が必要であるという事実を無視しており、結果が正しいことを期待しています。ただし、テスト スーツが大きくなると、実行にかなりの時間がかかるため、これがどのように問題になるかは既にわかっています。さらに重要なことは、ネットワーク接続がうまくいかないという理由だけでテストが失敗することを望んでいないということです。提案をいただければ幸いです。

4

1 に答える 1

1

テストを高速で、信頼性が高く、再現可能に保つという意図は、良いものです。ネットワークへの依存を取り除くことは、これらの目標を達成するための優れた方法です。

現在の方法に縛られるのではなく、使用しようとしているツールがテスト駆動型開発と呼ばれることを思い出してください。テストは、コードが記述どおりに機能することを確認する単なるラッパーではありません。コードを改善して、テスト可能性、信頼性、再利用性などを向上させる方法を見つける方法です。

ネットワークへの依存をなくすには、文字列の代わりに URL (パラメーターの名前は既に imageURL になっています) を渡すことを検討できます。このようにして、ネットワーク上の場所ではなく、ローカル ファイル システムへの URL を作成できます。

また、あなたのメソッドが実際に多くの作業を行っていることにも気付きました。その実際の動作を説明する名前は、loadImageFromURLAndScaleItAndSaveItToDisk: のようになります。いくつかのより小さく、よりテストしやすいメソッドに分割してみませんか? おそらく、URL から画像をロードするもの、画像をスケーリングするもの、ローカル ファイル システムに画像を保存するものなどです。個々の部分をそれぞれテストしてから、元のメソッドをテストする別の単体テストを作成して、その結果を小さなメソッドを順番に呼び出した結果と比較することができます。

テストを速く、信頼性が高く、再現可能に保つことは良い目標だとも思いますが、「より遅い」または「1000%信頼できない」テストを作成したい場合はOK . 自分にとって価値のあるテストは、十分なテストではないと考えてテストを書かないよりはましです。

ほとんどが一般的なものであることは承知していますが、お役に立てば幸いです。

于 2013-10-09T01:54:14.060 に答える