あなたの質問についていくつかコメントしてください。 まず、AFHTTPClientを直接作成しているため、コードをテストするのは難しいです。単なるサンプルであるかどうかはわかりませんが、代わりに注入する必要があります(下のサンプルを参照)。
次に、リクエストを作成してから、AFHTTPRequestOperationを作成してエンキューします。これは問題ありませんが、AFHTTPClientメソッドのgetPath:parameters:success:failure:を使用して同じ結果を得ることができます。
私はその提案されたHTTPスタブツール(Nocilla)での経験はありませんが、NSURLProtocolに基づいています。私はいくつかの人々がこのアプローチを使用していることを知っていますが、私は自分のスタブされたレスポンスオブジェクトを作成し、次のコードで見られるようにHTTPクライアントをモックする方が好きです。
リトリーバーは、AFHTTPClientを注入する場所をテストしたいクラスです。 私は物事をシンプルで簡単にテストしたいので、私は直接ユーザーIDとイベントIDを渡しています。その後、他の場所で、あなたは、このメソッドにaccout uidの値を渡すというように... ヘッダファイルは、次のようになります。
#import <Foundation/Foundation.h>
@class AFHTTPClient;
@protocol RetrieverDelegate;
@interface Retriever : NSObject
- (id)initWithHTTPClient:(AFHTTPClient *)httpClient;
@property (readonly, strong, nonatomic) AFHTTPClient *httpClient;
@property (weak, nonatomic) id<RetrieverDelegate> delegate;
- (void) retrieveEventWithUserId:(NSString *)userId eventId:(NSString *)eventId;
@end
@protocol RetrieverDelegate <NSObject>
- (void) retriever:(Retriever *)retriever didFindEvenData:(NSDictionary *)eventData;
@end
実装ファイル:
#import "Retriever.h"
#import <AFNetworking/AFNetworking.h>
@implementation Retriever
- (id)initWithHTTPClient:(AFHTTPClient *)httpClient
{
NSParameterAssert(httpClient != nil);
self = [super init];
if (self)
{
_httpClient = httpClient;
}
return self;
}
- (void)retrieveEventWithUserId:(NSString *)userId eventId:(NSString *)eventId
{
NSString *path = [NSString stringWithFormat:@"/user/%@/event/%@", userId, eventId];
[_httpClient getPath:path
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSDictionary *eventData = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:NULL];
if (eventData != nil)
{
[self.delegate retriever:self didFindEventData:eventData];
}
}
failure:nil];
}
@end
とテスト:コメントする
#import <XCTest/XCTest.h>
#import "Retriever.h"
// Collaborators
#import <AFNetworking/AFNetworking.h>
// Test support
#import <OCMock/OCMock.h>
@interface RetrieverTests : XCTestCase
@end
@implementation RetrieverTests
- (void)setUp
{
[super setUp];
// Put setup code here; it will be run once, before the first test case.
}
- (void)tearDown
{
// Put teardown code here; it will be run once, after the last test case.
[super tearDown];
}
- (void) test__retrieveEventWithUserIdEventId__when_the_request_and_the_JSON_parsing_succeed__it_calls_didFindEventData
{
// Creating the mocks and the retriever can be placed in the setUp method.
id mockHTTPClient = [OCMockObject mockForClass:[AFHTTPClient class]];
Retriever *retriever = [[Retriever alloc] initWithHTTPClient:mockHTTPClient];
id mockDelegate = [OCMockObject mockForProtocol:@protocol(RetrieverDelegate)];
retriever.delegate = mockDelegate;
[[mockHTTPClient expect] getPath:@"/user/testUserId/event/testEventId"
parameters:nil
success:[OCMArg checkWithBlock:^BOOL(void (^successBlock)(AFHTTPRequestOperation *, id))
{
// Here we capture the success block and execute it with a stubbed response.
NSString *jsonString = @"{\"some valid JSON\": \"some value\"}";
NSData *responseObject = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
[[mockDelegate expect] retriever:retriever didFindEventData:@{@"some valid JSON": @"some value"}];
successBlock(nil, responseObject);
[mockDelegate verify];
return YES;
}]
failure:OCMOCK_ANY];
// Method to test
[retriever retrieveEventWithUserId:@"testUserId" eventId:@"testEventId"];
[mockHTTPClient verify];
}
@end
最後の事はAFNetworking 2.0バージョンは、それはあなたの要件をカバーする場合、それを使用することを検討ので、放出されることです。
[Nocilla](https://github.com/luisobo/Nocilla)をご覧ください。既存の 'NSURLConnections'に簡単にフックし、その動作を定義することができます。 – mAu