を実行すると、テスト対象のメソッドです:OCMockとブロックテスト、ここで
- (void)loginWithUser:(NSString *)userName andPass:(NSString *)pass {
NSDictionary *userPassD = @{@"user":userName,
@"pass":pass};
[_loginCntrl loginWithUserPass:userPassD withSuccess:^(NSString *authToken){
// save authToken to credential store
} failure:^(NSString *errorMessage) {
// alert user pass was wrong
}];
}
私がテストしたいものは、その成功に他の依存関係をブロック/ OCMockObject _credStoreが適切な方法で呼び出されていることです。だから、現在loginCtrlとcredStoreの依存関係はOCMockObjectsであり、それらをスタブ/期待することができます。
loginControllerをスタブして、呼び出したときに何とかそのブロックを実行できますか?私はOCMockでブロックをスタブすることに関するいくつかの質問を見てきました。私は自分のやっていることを頭で囲むことができません。
実際には、コード_credStore saveUserPassが完了し、_credStoreで検証できるように、ブロック([success invoke] ??)を起動するOCMockが必要です。私は停止し
:
- (void)test_loginWithuserPass_succeeds_should_call_credStore_setAuthToken {
NSDictionary *userPassD = @{@"user":@"mark",
@"pass":@"test"};
id successBlock =^{
// ??? isn't this done in the SUT?
};
[[[_loginController stub] andDo:successBlock] loginWithUserPass:userPassD withSuccess:OCMOCK_ANY failure:OCMOCK_ANY];
[[_credentialStore expect] setAuthToken:@"passed back value from block"];
[_docServiceSUT loginWithUser:@"mark" andPass:@"test"];
[_credentialStore verify];
}
ETA:
// OCUnit test method
- (void)test_loginWithUserPass_success_block_should_call_credentials_setAuthToken {
void (^proxyBlock)(NSInvocation*) = ^(NSInvocation *invocation) {
void(^successBlock)(NSString *authToken);
[invocation getArgument:&successBlock atIndex:3]; // should be 3 because my block is the second param
successBlock(@"myAuthToken");
};
[[[_loginController expect] andDo:proxyBlock] loginWithUserPass:OCMOCK_ANY withSuccess:OCMOCK_ANY failure:OCMOCK_ANY];
[[_credentialStore expect] setAuthToken:@"myAuthToken"];
[_docServiceSUT loginWithUser:@"mark" andPass:@"myPass"];
[_loginController verify];
[_credentialStore verify];
}
//method under test
- (void)loginWithUser:(NSString *)userName andPass:(NSString *)pass {
NSDictionary *userPassD = @{@"user":userName,
@"pass":pass};
void(^onSuccess)(NSString *) = ^(NSString *authToken){
[SVProgressHUD dismiss];
[_credentials setAuthToken:authToken];
// Ask user to enter the 6 digit authenticator key
[self askUserForAuthenticatorKey];
};
void(^onFailure)(NSString *) = ^(NSString *errorMessage) {
[SVProgressHUD dismiss];
[_alertSender sendAlertWithMessage:errorMessage andTitle:@"Login failed"];
};
[SVProgressHUD show];
[_loginCntrl loginWithUserPass:userPassD withSuccess:onSuccess
failure:onFailure];
}
実際のコードはコンパイルされません、行にエラーがあります:void(^ successBlock)(NSString * authToken)、基本的に誤った構文です。私の変数のためにそれを修正しました。 –
getArgumentAtIndexメソッドもありませんが、getArgument:atIndex:メソッドがありますが、getArgumentにはどうすればいいですか?私がコンパイルして実行しているが、例外を投げているものを上に更新しました。 –
NSInvocation + OCMAdditions.hがプロジェクトに含まれていることを確認する必要があります(https:// github。com/erikdoe/ocmock/blob/master/Source/OCMock/NSInvocation%2BOCMAdditions.h)これにより、getArgumentAtIndexAsObjectにアクセスできます。最初の2つの引数は 'self'と' cmd'ですので、成功ブロックが必要な場合は3番目の引数が必要です。 –