2

NSURLConnectionの動作をテストしようとしているOCMockを使用しています。不完全なテストは次のとおりです。

#include "GTMSenTestCase.h"
#import <OCMock/OCMock.h>

@interface HttpTest : GTMTestCase

- (void)testShouldConnect;

@end

@implementation HttpTest

- (void)testShouldConnect {
  id mock = [OCMockObject mockForClass:[NSURLConnection class]];

  NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  NSURLRequest *request = [NSURLRequest requestWithURL:url];
  NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:mock startImmediately:NO];

  [[mock expect] connection:connection didReceiveResponse:OCMOCK_ANY];
}

@end

デリゲートメソッドconnection:didReceiveresponse:であるカテゴリメソッドを使用してクラスをモックすると、次のエラーが発生します。

Unknown.m:0:0 Unknown.m:0: error: -[HttpTest testShouldConnect] : *** -[NSProxy doesNotRecognizeSelector:connection:didReceiveResponse:] called!

誰かがこれに問題がありましたか?

4

2 に答える 2

4

NSURLConnection のモック オブジェクトを作成したようです。ただし、NSProxy の警告は正しく、NSURLConnection オブジェクトにはセレクター connection:didReceiveResponse: がありません。これは、プロトコルを実装するオブジェクトに渡されるセレクターです。

NSURLConnectionDelegate を実装するオブジェクトをモックする必要があります。デリゲート プロトコルは connection:didReceiveResponse: を指定しているため、エラーは発生しません :)

私はOCMockの経験があまりありませんが、これはコンパイルエラーを取り除くようです:

@interface ConnectionDelegate : NSObject { }
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
@end

@implementation ConnectionDelegate
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { }
@end



@interface ConnectionTestCase : SenTestCase { }
@end

@implementation ConnectionTestCase

- (void)testShouldConnect {
 id mock = [OCMockObject mockForClass:[ConnectionDelegate class]];

 NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
 NSURLRequest *request = [NSURLRequest requestWithURL:url];
 NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:mock startImmediately:NO];

 [[mock expect] connection:connection didReceiveResponse:OCMOCK_ANY];
}

@end

お役に立てれば、

サム

于 2009-11-05T15:03:47.987 に答える
0

GCC オプションCOPY_PHASE_STRIPを設定してプロジェクト ライブラリをコンパイルするとYES、シンボルが表示されないため、このエラーが発生しました。その後、テストはそのライブラリに対して実行され、スタブ設定が必要なメソッドを確認できずCOPY_PHASE_STRIP=NO、問題が修正されました

于 2014-03-13T17:22:35.617 に答える