2017-01-16 5 views
0

メソッドのコード:内部で共同作業者をインスタンス化するメソッドの単体テストを書く方法は?そのような

- (void)downloadSomething:(NSString *)url { 
    Downloader *downloader = [[Downloader alloc] initWithUrl:url]; 
    NSData *data = [downloader download]; 
    FileCache *cache = [[FileCache alloc] initWithFile:@"download.cache"]; 
    cache.data = data; 
    [cache save]; 
} 

私はそれがうまく動作するかどうかを確認するためのダウンローダとファイルキャッシュを模擬すべきだと思います。 私はそのような変更の署名について考えました:downloadSomething:(NSString *)url downloader:(Downloader *)downloader cache:(FileCache *)cache、しかし、それは私が欲しいものではない、このメソッドを呼び出す前に多くの仕事をしなければならないようだ。

私はocmockitoを使用しています。

さらに、コードを書くことをよりテスト可能にするガイドがありますか?


編集:2017年1月16日午後02時54分23秒

は、これはのような2つのメソッドを作成することをお勧めします:コラボはメソッド内でインスタンス化されると

- (void)updateCacheWithUrl:(NSString *)url 
       downloader:(Downloader *)downloader 
       fileCache:(FileCache *)fileCache; // for testing 
- (void)updateCacheWithUrl:(NSString *)url; // call above method with (url, nil, nil); 

答えて

1

、これにより密結合が生じる。これをテストすることの難しさは、私たちが他のデザインを探求するように導く。

1つの方法は、それらを渡すことです。これは私が通常行っていることです。次に、私は生産コード用のデフォルトオブジェクトを提供するより簡単なバージョンを作成します。

しかし、あなたの例では、urlDownloaderに渡されます。これはこれをより困難にします。これは、現在の設計downloadSomething:が単一責任原則に違反していることを示しています。ダウンロードとキャッシュの2つのことをしています。

これらの責任を分割すると、おそらくテストが簡単になります。

+0

おそらく私はメソッドを 'updateCacheWithUrl:'に改名する必要があります。 – ccnyou

+0

私はたくさんのことを考えました。 'Downloader * downloader = [[Downloader alloc] initWithUrl:url];'と書いたところでは、そのメソッドをテストするのが難しくなります。私はそれを私的な方法で書いて、そのテストを書いてはいけませんか? – ccnyou

+0

@ccnyou Downloaderを1つの方法で作った場合、私はファクトリとして動作するブロックパラメータを渡します。複数のメソッドにまたがっている場合は、パラメータからプロパティに変更します。 –

関連する問題