3

私のアプリケーションでは、一部のタスクにサードパーティの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 をオーバーライドします。

ターゲットに実装の一部が存在しないのに、コンパイラ/リンカー エラーが発生せず、単体テストが実際に実行されたのはなぜなのか、今でも疑問に思っていますが、重要なことは、現在は機能していることです。

4

1 に答える 1

0

TestRedirect.h次の内容のヘッダー ファイルを作成する必要があります。

#ifdef UNIT_TESTING

#define thirdPartyDoStuffFunction MyTest_thirdPartyDoStuffFunction
..........

#endif

このファイルを、テストするクラスを含むすべてのファイルに含めます。その後、2 つの異なるビルドを作成します。

  • -DUNIT_TESTINGテスト用のコンパイラ キーを持つもの。
  • 通常の仕事のためのそのキーのない他のもの。

テスト関数は次のように単純に定義する必要がMyTest_thirdPartyDoStuffFunctionあり、テスト構成でのみリンクに含める必要があります。

于 2012-09-05T03:48:15.410 に答える