7

iOS4およびXcode4/SDK4.3でのユニットおよびアプリケーションのテストにOCMock1.77を使用しようとしています。http://www.mulle-kybernetik.com/software/OCMock/にある静的ライブラリとしてOCMockを使用する手順に従いました。ユニットテストとアプリケーションテストは、OCMockがなくても正常に実行されます。

OCMockを追加してシミュレーター用にOCMockのテストスイートを実行しようとすると(単体テスト)、テストリグがコード134でクラッシュします。テストリグはデバイスに対して正常に実行されます(アプリケーションテスト)。コンソールを見ると、以下のメッセージが表示されます。これは、上記のURLの手順に従って-force_loadリンカーフラグを追加していないことを示しています。しかし、私は...何か考えはありますか?

私はこれを見ました:iOS 4でOCMock検証を使用してコード134でテストリグが異常終了しました。これは、この動作がバグであることを示唆していますが、OCMockテストスイートを実行しているため、同じ状況かどうかはわかりません。バグの場合、単体テストでモックを使用するための回避策はありますか?

TIA。

=====

コンソール出力:

3/30/11 1:02:32 AM  otest[38552]    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '** Expected method not present; the method getArgumentAtIndexAsObject: is not implemented by NSInvocation. If you see this exception it is likely that you are using the static library version of OCMock and your project is not configured correctly to load categories from static libraries. Did you forget to add the -force_load linker flag?'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x004a05a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x002cf313 objc_exception_throw + 44
    2   CoreFoundation                      0x00458ef8 +[NSException raise:format:arguments:] + 136
    3   CoreFoundation                      0x00458e6a +[NSException raise:format:] + 58
    4   LogicTests                          0x00f89de4 +[OCMockObject initialize] + 115
    5   libobjc.A.dylib                     0x002cfd9b _class_initialize + 380
    6   libobjc.A.dylib                     0x002d773f prepareForMethodLookup + 73
    7   libobjc.A.dylib                     0x002ce069 lookUpMethod + 86
    8   libobjc.A.dylib                     0x002ce1d6 _class_lookupMethodAndLoadCache + 40
    9   libobjc.A.dylib                     0x002e10e3 objc_msgSend + 87
    10  SenTestingKit                       0x20108824 +[NSObject(SenTestRuntimeUtilities) senAllSubclasses] + 107
    11  SenTestingKit                       0x201074a7 +[SenTestSuite updateCache] + 39
    12  SenTestingKit                       0x20107443 +[SenTestSuite suiteForBundleCache] + 92
    13  SenTestingKit                       0x201073a4 +[SenTestSuite testSuiteForBundlePath:] + 108
    14  SenTestingKit                       0x2010606b +[SenTestProbe specifiedTestSuite] + 332
    15  SenTestingKit                       0x20106792 +[SenTestProbe runTests:] + 156
    16  otest                               0x000023c7 0x0 + 9159
    17  otest                               0x000025f2 0x0 + 9714
    18  otest                               0x0000209a 0x0 + 8346
    19  otest                               0x00002049 0x0 + 8265
)
4

2 に答える 2

8
  • http://ocmock.org/#downloadからOCMock*。**をダウンロードします(この記事の執筆時点では1.77)
  • OCMock /(または別のフォルダー)で解凍します->「リリース」と「ソース」の2つのフォルダーがあります
  • xCodeプロジェクトフォルダ内の「Release/Library」フォルダをコピーします
  • プロジェクト内のすべての「ライブラリ」フォルダをドラッグして、ファイルをxcodeにリンクします
    • ターゲットとしてアプリケーションTESTターゲットを選択してください!
  • テストターゲットの「ビルド設定」に移動します
    • [検索パス]の下に次を追加します。+[ヘッダー検索パス]->OCMockヘッダー(.h)へのパスを挿入します($(PROJECT_DIR)/ Library / Headersなど)+"ライブラリ検索パス"-> OCMockライブラリへのパス(.a)($(PROJECT_DIR)/ Library /など)注:パスとして$(PROJECT_DIR)または$(SRCROOT)/を使用し、再帰チェックボックスを選択して、完全なパスが挿入されないようにすることもできます。
      • [リンク]の下に次を追加します:+[その他のリンクフラグ]->-all_load

これですべてが正しく機能するはずです。確認するには:

#import <OCMock/OCMock.h>
// simple test to ensure building, linking, 
// and running test case works in the project
- (void)testOCMockPass {
id mock = [OCMockObject mockForClass:NSString.class];
[[[mock stub] andReturn:@"mocktest"] lowercaseString];
NSString *returnValue = [mock lowercaseString];
STAssertEqualObjects(@"mocktest", returnValue, @"Should have returned the expected string.");
}

- (void)testOCMockFail {
id mock = [OCMockObject mockForClass:NSString.class];
[[[mock stub] andReturn:@"mocktest"] lowercaseString];
NSString *returnValue = [mock lowercaseString];
STAssertEqualObjects(@"thisIsTheWrongValueToCheck", returnValue, @"Should have returned the expected string."); 
}

感謝します:

エンリコ・ボッタニ

于 2011-09-21T09:14:29.380 に答える
3

-force_loadフラグを削除することでこれを再現できます。メインターゲットではなくテストターゲットに設定されていること、および静的ライブラリの正しい場所を指していることを確認してください。私の場合、それは

-force_load $(PROJECT_DIR)/Libraries/libOCMock.a

リンクしたもう1つのSOの質問は、モックのverifyメソッドが失敗すると、NSInvocationのカテゴリメソッドから例外がスローされ、otestがクラッシュするというものです。それはまだ機能します。メッセージは、XCodeがテストクラスのエラーとしてラベル付けするアサーションの失敗よりもわかりにくいものです。

于 2011-03-30T15:28:54.383 に答える