2010-12-03 10 views
4

申し訳ありませんが、これを理解しようとして約5時間を費やしました。過去のStackoverflowのトピック解決策のどれも私のために働いていなかったので、誰かが私に答えを与え、野生のガチョウを追いかけることはできないと思っています。

問題:カスタムクラスの単体テストが必要なxcodeプロジェクトがあります。私は、iOS SDK 4.2でX-Code 3.2.5を使用しています。いくつかの異なる方法を実行した後、カスタムテストクラスでユニットテストを行うことができません。 Appleの例を使ってうまく動作します。

カスタムクラスは、単純なサブクラス化されたNSObjectで、簡単なiVarsを使用します。クラス "Snookie"と呼ぶことにします。

私はすでにいくつかの疑問のある解決策を試みましたが、まったく同じ問題を抱えている人からの返答を受け取りたいと思います。

レプリケーション:

  1. MyAppTestingユニットテストバンドルターゲットを追加します。
  2. MyAppTestingのget infoの下に、MyAppを直接依存関係として追加します。
  3. "テスト"というグループを作成します。
  4. "テスト"の下に、ObjectiveCテストケースクラスを追加します。次のように新しいテストケースクラス.Mで
#import <SenTestingKit/SenTestingKit.h> 
#import <UIKit/UIKit.h> 

#import "Snookie.h" 

@interface SnookieTests : SenTestCase { 
    Snookie *snookieObject; 
} 
@end 

、ALLOC /初期化snookie: 新しいテストケースクラス.Hで

  • 、インポートSnookie.h、及びIVARを作成

    #import "SnookieTests.h" 
    
    
    @implementation SnookieTests 
    
    - (void) setUp 
    { 
        snookieObject = [[Snookie alloc] init]; 
    } 
    
    - (void) tearDown 
    { 
        [snookieObject release]; 
    } 
    
    @end 
    

    エラー:何を考えて

    "_OBJC_CLASS_$_Snookie", referenced from: 
    Objc-class-ref-to-Snookie in SnookieTests.o 
    Symbol(s) not found 
    Collect2: Id returned 1 exit status 
    
  • 答えて

    4

    リンカーは、のSnookieクラスの@implementationやそれがリンクしているフレームワーク/ライブラリを見つけることができないことを教えています。

    MyAppを直接依存として追加すると、XcodeにMyAppのコードをコンパイル/リンクするように指示するだけでは不十分です。 MyAppTestingのファイルにSnookie.mファイルを明示的に追加する必要があります。

    +0

    私はそれとあなたの回答を投稿している間、私は同じ問題を別の方法でとりました。 「アプリケーションのテスト」セクションのAppleのドキュメントhttp://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.htmlを参照してください。私は、テストに私のヘッダーをインポートし、正確に同じ手順を実行し、同じ結果を得ます。 – Richard

    +1

    この例では、テストしているクラスをテストバンドルにリンクする方法を説明していません。 Snookie.mをテストバンドルに追加する必要があります。それはまさにエラーがあなたに伝えていることです。 – JeremyP

    +0

    リラックスして休憩した後、KperryとJeremyPは100%正確でした。私のその後のエラーの原因は、コードのリファクタリングにつながった悪いインターフェイスプログラミングのためでした.....ありがとう!!!! – Richard

    0

    ケリーリーフが正しい。

    XCode 5では、テスト対象の実装ファイル(例:XYZCustomClass.m)をクリックして、[ユーティリティ]画面([表示]> [ユーティリティ]> [表示ユーティリティ]ターゲットメンバーシップボックスの[テスト名]チェックボックスをオンにします。あなたのユニットは "OBJC_CLASS_ $ ...。"を参照しています:objc-class-ref。 。 ._Tests.o "というエラーメッセージが表示されなくなります。

    4

    アプリの.mファイルをテスト対象に直接追加すると、問題は解決されますが、冗長で不要です。the steps outlined here by Two Bit Labsに従ってください。

    1. テストターゲットのBundle Loaderビルド設定は、アプリケーションのバンドルを指しています。
    2. テストターゲットのTest Hostビルド設定は、あなたのアプリケーションのバンドルを指しています。
    3. アプリターゲットの ビルド設定はNOです。
    +0

    これは私のためには機能しません。デフォルトで隠しているシンボルを設定した後、いいえ、ビルド&クリーン&ビルド&クリーン&ビルド、私はまだ私の.mのリンクを取得しません。 – Ethan

    +0

    これは、ジョブを実行する唯一の正しい方法です。他のすべては、プロジェクトに冗長性を追加しています。あなたが上のリンクのガイドラインに従えば、これは完璧に働いています。 –

    関連する問題