5

私は、Xcode を使用した単体テストの非常に率直に恐ろしい世界に飛び込もうとしています (そのような複雑なプロセスのようです)。

基本的に、このテスト クラスがあり、Show.h クラスをテストしようとしています。

#import <GHUnit/GHUnit.h>
#import "Show.h"
@interface ShowTest : GHTestCase { }
@end

@implementation ShowTest
- (void)testShowCreate
{
    Show *s = [[Show alloc] init];
    GHAssertNotNil(s,@"Was nil.");      
}

@end

ただし、テストをビルドして実行しようとすると、次のエラーが表示されます: -

未定義のシンボル:

「_OBJC_CLASS_$_Show」、次から参照:

 __objc_classrefs__DATA@0 in ShowTest.o

ld: シンボルが見つかりません

collect2: ld が 1 つの終了ステータスを返しました

これはリンクエラーだと思います。ここにある指示のすべてのステップに従ってみました: -

http://github.com/gabriel/gh-unit/blob/master/README.md

そして、これらの指示のステップ2は私を混乱させました: -

[ターゲット 'テスト' 情報] ウィンドウの [全般] タブで、次の操作を行います。

リンクされたライブラリを追加し、Mac OS X 10.5 SDK セクションで GHUnit.framework を選択します。

リンクされたライブラリを追加し、プロジェクトを選択します。

直接の依存関係を追加し、プロジェクトを選択します。(これにより、アプリケーションまたはフレームワークがテスト ターゲットの前にビルドされます。)

すべてのプロジェクトが .dylib、.framework、および .o ファイルを受け入れる場合、プロジェクトをリンクされたライブラリ リストに追加するにはどうすればよいですか?

4

3 に答える 3

7

テストするターゲットがアプリケーションの場合、メイン ターゲットとテスト ターゲットの両方に Show.h/m ファイルを手動で含める必要があります。

これを反映するために README も更新しました。

  • メイン ターゲットがライブラリの場合: リンクされたライブラリを追加し、メイン ターゲットを選択します。これは、テスト ターゲットをメイン ターゲットにリンクできるようにするためであり、両方のターゲットにソース ファイルを手動で含める必要はありません。
  • 主なターゲットがアプリケーションの場合、これらのソース ファイルをTestプロジェクトに手動で含める必要があります。

混乱させて申し訳ありません!両方のターゲットにファイルを含める必要があるのは理想的ではありません。

于 2010-04-09T23:30:14.100 に答える
0

Apple の例は、ターゲットに .m ファイルを複製することなく動作します。

Apple の単体テスト サンプル コード (iPhoneUnitTests.zip) をここからダウンロードします。

http://developer.apple.com/IPhone/library/samplecode/iPhoneUnitTests/Introduction/Intro.html

CalcTests ターゲットをクリックします。このターゲットには CalcTests.m のみが含まれます。

ターゲットをビルドします。CalcAppDelegate やその他のクラスのリンク エラーなしでビルドされます。

これを機能させる魔法は何ですか?

于 2010-04-10T02:52:44.850 に答える
0

forが必要@implementationですShow

または、使用できます

Show* s = [[objc_getClass("Show") alloc] init];
...

また

Show* s = [[NSClassFromString(@"Show") alloc] init];
...

実行時にクラスを解決します。

于 2010-04-09T20:29:06.000 に答える