1

遅延を伴う別のメソッドを呼び出すメソッドのブラック ボックス ユニット テストを作成したいと考えています。次のようになります。

- (void) doSomething {
    // Do something
    [self performSelector:@selector(doSomethingLater) withObject:nil afterDelay:kDelay];
}

- (void) doSomethingLater { }

wherekDelayは定数であり、doSomethingLater非公開です。問題はkDelay1 秒であり、単体テストの実行を遅くしたくないということです。

doSomethingブラックボックス アプローチで (または可能な限り)単体テストを行うには、どのような方法が最適でしょうか?

頭に浮かぶ唯一のことは、クラスにメソッドを追加して の値を変更することですがkDelay、これは別の開発者によって偶然使用される可能性があります。より侵襲性の低い代替手段はありますか?

4

3 に答える 3

0

侵襲性が低いかどうかはわかりませんが、-[NSObject performSelector:withObject:afterDelay:]遅延のない独自のバージョンでメソッドをスウィズルすることができます。

スウィズリングとは、実行時にメソッド実装を置き換えることを意味します。無料をチェックしてくださいJRSwizzle library

于 2011-12-11T22:38:22.143 に答える
0

最初に確認することは、メソッドが実行されたことを検出することです。@Robが言ったように、別の方法でスウィズリングを検討します。おそらく、それが呼び出されたことを示すためにブール値を設定するテストにローカルなものです。

次の問題は、遅延を減らすことです。KDelay は定数であるため、実際には何もできません。プライベート プロパティまたはテストとセットでアクセスできるものに変更できますが、運用コードに対してはまだプライベートです。

別のオプション (可能かどうかは調べていません!) は、実行中のメソッドの検出についてあまり心配する必要はありませんが、呼び出しが実行ループ スタックであり、実行されるのを待っていることを検出できるかどうかを調べます。 . 通話自体ではなく、保留中の通話の存在を検出できる場合は、すぐにこれを行うことができ、遅延は無関係になります。

于 2011-12-11T23:00:41.387 に答える
0

あなたのテストは、doSomethingLater が呼び出され、それが想定どおりに実行されたことを確認したいですか?そして、あなたがやろうとしているのは遅延時間を短縮することだけですか? その場合は、定数値を doSomething に返すプライベート メソッドを作成することをお勧めします。何かのようなもの:

@implementation MyClass

- (NSUInteger) getDelay {
    return kDelay;
} 

@end

次に、OCMock などの他のテスト フレームワークのさまざまな機能を使用して、実行時に getDelay の実装をスタブ化できます。

于 2011-12-11T23:02:58.373 に答える