2011-12-11 1 views
1

遅延を持つ別のメソッドを呼び出すメソッドのブラックボックスユニットテストを書いてみたいと思います。 kDelayが一定であるとdoSomethingLaterがプライベートでObjective-Cで遅延のあるメソッドをユニットテストする

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

- (void) doSomethingLater { } 

:それはちょっと、このようになります。問題はkDelayが1秒であることと、私はユニットテストの実行を遅くしたくないということです。

は何最高のブラックボックス・アプローチの下でユニットテストdoSomethingへの道(またはできるだけ多く)でしょうか?

唯一のことは、クラスにメソッドを追加してkDelayの値を変更することですが、これは別の開発者が偶然に使用する可能性があります。あまり侵襲的でない選択肢はありますか?

答えて

0

それは、低侵襲性だかどうかは知りませんが、遅延していない独自のバージョンで-[NSObject performSelector:withObject:afterDelay:]方法をスウィズルことができます。

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

+0

私はそれが異なる方法で侵襲的だと思います。 –

+0

このアプローチの問題は、何らかの理由でperformSelectorを別のメソッドに対してdelayで変更するとテストが遅くなり、誰もその理由を知ることができない場合です。 – hpique

+0

しかし、定数をうごかすことができればいいですね。 – hpique

0

最初に私が見ているのは、このメソッドが実行されたことを検出していることです。だから@Robは言った、私は別の方法でうねりに目を向けるだろう。おそらく、それが呼び出されたことを示すブールを設定するテストのローカルの1つです。

次の問題は遅延を減らすことです。 KDelayは定数なので、実際には何もできません。テストで設定してアクセスできるプライベートプロパティなどに変更できますが、プロダクションコードではまだプライベートです。

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

0

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

@implementation MyClass 

- (NSUInteger) getDelay { 
    return kDelay; 
} 

@end 

次にあなたがOCMock他のテストフレームワークのようなものの様々な機能を使用して、実行時にgetDelayの実装をスタブアウトすることができます。

関連する問題