1

私のプロジェクトでは、Objective C と単体テストにはまったく慣れていませんが、少し TDD を実行したいと考えていました。JSON 応答を返す Web サービスに接続するプロジェクトを作成しました。これで、Web サービスをモックする単体テストを作成しましたが、クラッシュし続け (失敗することさえありません)、現時点では完全に途方に暮れています....

次のセットアップがあります。

SignUpService(新しいアカウントを作成する) を使用するServiceHelper(実際の http Web サービス要求を作成する)。このようにServiceHelper.h

@protocol ServiceHelperProtocol <NSObject> 
@required
- (NSString *)get:(NSString *)url; 
@end

@interface ServiceHelper : NSObject <ServiceHelperProtocol> {
    NSMutableData *receivedData; 
}

SignUpService.h

@class ServiceHelper;

@protocol SignUpServiceProtocol <NSObject>
- (NSString *)createUserAccount:(CreateUserAccountRequest *)createUserAccountRequest;
- (bool)doesUsernameExist:(NSString *)userName;
- (BOOL)isEmailValid:(NSString *)email;
- (BOOL)doesEmailExist:(NSString *)email;
@end

@interface SignUpService : NSObject <SignUpServiceProtocol> {
    id <ServiceHelperProtocol> serviceHelper;
}

@property(strong) id <ServiceHelperProtocol> serviceHelper;
- (id)initWithHelper:(id <ServiceHelperProtocol>)myServiceHelper;

次は単体テスト (SignUpServiceTests.h と実装) です。

@interface SignUpServiceTests : SenTestCase {
    id <NSObject, ServiceHelperProtocol> serviceHelper;

    SignUpService *signUpService;
    CreateUserAccountRequest *createUserAccountRequest;
}
@property(nonatomic, strong) SignUpService *signUpService;
@property(nonatomic, strong) CreateUserAccountRequest *createUserAccountRequest;
@property(nonatomic, strong) id <NSObject, ServiceHelperProtocol> serviceHelper;

そして実装:

@implementation SignUpServiceTests

@synthesize signUpService;
@synthesize createUserAccountRequest;
@synthesize serviceHelper;

- (void)setUp {
    [super setUp];

    // Set-up code here.
    self.createUserAccountRequest = [[CreateUserAccountRequest alloc] init];
    self.createUserAccountRequest.firstName = @"first-name";
    self.createUserAccountRequest.lastName = @"last-name";
    .....

    self.serviceHelper = [ServiceHelper new];

    self.signUpService = [[SignUpService alloc] initWithHelper:(id <ServiceHelperProtocol>) self.serviceHelper];
}

- (void)tearDown {
    // Tear-down code here.
    [super tearDown];
}

- (void)testOnCreateUserAccountShouldReturnCreatedUserIdWhenCorrectResponseFromService {
    id mock = [OCMockObject partialMockForObject:(NSObject *) (id <ServiceHelperProtocol>) self.serviceHelper];
    [[[mock stub] andReturn:@"{\"status\":\"ok\",\"create_user\":\"12\"}"] get:[OCMArg any]];

    assertThat([self.signUpService createUserAccount:self.createUserAccountRequest], equalTo(@"12"));
}

このプロジェクトには、OCMock バージョン 1.77 と OCHamcrest ライブラリが含まれています。

何らかの理由で、テストは「プロセスは終了コード 0 で終了しました」でクラッシュし続けます。デバッグ中は、何が問題なのかわかりません。メモリ管理と関係があると思いますか、それとも OCMock と ARC と関係がありますか? (ここここで提案されているように)

初心者の Objective C 開発者への考えや提案はありますか?

4

1 に答える 1

0

これ以上の情報がなければ、メモリの問題ではなく、octestの起動時にローダーがOCMockフレームワークを見つけることができないためだと思います。OS Xでは、リンカー(ビルド時)は、ローダー(実行時)とは異なる手段を使用してフレームワークを検索します。

OCMockのパブリックリリースは、ローダーパスに@rpathを使用して構築されています。これにより、実行時のプロジェクトレイアウトにかなりの柔軟性がもたらされますが、最初は混乱する可能性があります。最初のステップとして、OCMockフレームワークが使用可能なディレクトリを含めるようにLC_RPATH環境変数を設定できますか?dyldのmanページでの@rpathの説明には、より詳細な情報があります。

ちなみに、OCMock2.0は最近リリースされました。

于 2012-04-15T21:07:19.897 に答える