私のアプリケーションでは、一部のタスクにサードパーティのC API を使用しています。単体テスト環境をセットアップして機能させるのは現実的ではないため、API を呼び出すクラスを単体テストする方法を考えていました。
例。私のクラスの1つには、次のようなメソッドがある場合があります。
- (id) doSomeStuff
{
// my code
// ...
thirdPartyDoStuffFunction(17, 4);
// etc...
}
対応する単体テスト:
- (void) testDoSomeStuff
{
MyClass *x = [[MyClass alloc] init];
id result = [x doSomeStuff];
STAssertNotNil(result, @"Result mustn't be nil");
}
私の手に負えない理由でthirdPartyDoStuffFunction
、単体テストターゲットの実行中に呼び出すと、テストがクラッシュするとしましょう。この理由と、関数が正しい引数で呼び出されていることを確認したいので、それをモックしたいと思います。
これは私がこれまでに試したことです:
- サードパーティ関数をそれらのモック バージョンにリダイレクトするプリプロセッサ マクロの定義。しかし、これまでのところ、私はそれを機能させることができませんでした。
UNIT_TEST
まず、単体テスト ターゲットの構成でプリプロセッサ定数を定義しようとしましたが、定数は単体テスト クラスにのみ影響し、テストしているクラスには影響しません。 - 次に、テスト ターゲットのプレフィックス ヘッダーの作成に関するこのスレッドを見つけました。これは、最初の方法とまったく同じ効果があるようです。
UNIT_TEST
プレフィックス ヘッダーで定義された定数は、テスト クラスではなく、テスト クラスでのみ表示されます。
更新:上記のアプローチはどちらも今のところうまくいきます。テスト対象のクラスの実装ファイル ( .m
) が単体テストのターゲットに追加されていなかったことが原因のようです。それらを追加すると、マクロは期待どおりに実行されます。つまり、サードパーティの API をオーバーライドします。
ターゲットに実装の一部が存在しないのに、コンパイラ/リンカー エラーが発生せず、単体テストが実際に実行されたのはなぜなのか、今でも疑問に思っていますが、重要なことは、現在は機能していることです。