kiwi を使用したネットワーク API のテストをいくつか書いています。
関連するコードは次のとおりです。
/////////////////////////////////////////////// //// MyAPI.h //////////////////////////////////////// ///////////
@protocol MyAPIDelegate<NSObject>
-(void) onMyMethodCall:(id)response;
-(void) onFail:(NSError*)error message:(NSString*)message;
@end
@interface MyAPI : NSObject
@property (nonatomic, weak) id<MyAPIDelegate> delegate;
-(void) myMethodCall;
@end
/////////////////////////////////////////////// //// MyAPI.m //////////////////////////////////////// ///////////
@synthesize delegate
-(void) myMethodCall
{
NSDictionary *params = [Dictionary dictionaryWithObject:@"value1" forKey:@"param1"];
[self apiCallWithServerPath:@"logic/myMethodCall"
parameters:params
onSuccess:^(id response) {
[delegate onMyMethodCall];
}
onFailure:^(NSError *error, NSString* msg) {
[delegate onFail:error message:msg];
}];
}
-(void) apiCallWithServerPath:(NSString *)serverPath parameters:(NSDictionary *)parameters onSuccess:(void (^)(id))success onFailure:(void (^)(NSError *, NSString *))failure
{
AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL urlWithString:@"http://www.myserver.com/"]];
[client setParameterEncoding:AFFormURLParameterEncoding];
[client postPath:serverPath
parameters:parameters
success:^(AFHTTPRequestOperation *operation, id responseObject) {
id response = [[JSONDecoder decoder] objectWithData:responseObject];
success(response);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"API call failed: error message = %@",[error localizedDescription]);
failure(error, [error localizedRecoverySuggestion]);
}];
}
/////////////////////////////////////////////// //// MyAPITest.m ///////////////////////////////////////// ///////////
SPEC_BEGIN(MyAPITest)
describe(@"MyAPITest should", ^{
__block MyAPI *api;
__block MyAPI *delegateMock;
beforeEach(^{
delegateMock = [KWMock mockForProtocol:@protocol(MyAPIDelegate)];
api = [[MyAPI alloc] init];
api.delegate = delegateMock;
});
afterEach(^{
delegateMock = nil;
api = nil;
});
it(@"should go to the server and get an answer, dont care about the value atm", ^{
[[api should] receive:@selector(myMethodCall)];
KWCaptureSpy *spy = [delegateMock captureArgument:@selector(onMyMethodCall:) atIndex:0];
// I usually put a breakpoint here...
[api myMethodCall];
[[expectFutureValue(spy.argument) shouldEventually] beNonNil];
});
});
SPEC_END
これは非常に単純なテストで、段階的に作成しています。最終的には spy.argument 内の値をテストしたいと思いますが、今のところ、それが nil でないことを確認することにのみ関心があります。
テストの実行は常に失敗します: [FAILED] 要求された引数はまだキャプチャされていません。
デバッグが機能しない: テストにブレークポイントを配置しようとすると (コメントが示す場所) 、メソッドにステップインすることはありません。
同時に、NSLog(s) を MyAPI の myMethodCall 内に配置すると、それらはコンソールに出力されません。
どんな助けでも大歓迎です。
/////////////////////// アップデート ////////////////////////// ////////
この行を(テストから)コメント/削除すると、次のようになります。
[[api should] receive:@selector(myMethodCall)];
テストは機能します。この行が問題を引き起こしている理由について何か考えはありますか?