Ocmock에서 핸들을 인수로 받아들이는 방법을 어떻게 조롱합니까?
-
18-09-2019 - |
문제
다음과 같은 서명과 동등한 방법을 조롱하려고합니다.
- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError **)error
테스트가 코드가 사전을 올바르게 사용하도록 할 수 있도록 작은 사전을 반환하기를 원합니다. 그러나 내가 무엇을하든 Ocmock은 내가 그 방법에 관계없이 항상 방법에서 nil을 반환합니다. 오류는 내가 테스트하는 코드에서 nil로 시작되며, 이것들은 내가 그것을 스터브하는 다른 방법입니다.
NSError * error = nil;
[[[mock stub] andReturn:someDict] uploadValues:YES error:&error];
[[[mock stub] andReturn:someDict] uploadValues:YES error:nil];
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg any]];
그리고 그들 중 누구도 작동하지 않습니다. Ocmock은 스터브 메시지 인수로 처리되며 그렇다면 올바른 방법은 무엇입니까?
해결책
슬프게도, 나는 이것에 대한 좋은 해결책을 찾지 못했습니다. 내가 말할 수있는 가장 좋은 점은 nserror **를 최대한 작게 사용하려고 시도한 다음 부분적인 모의를 완전히 조롱 할 수있는 격리 된 기능에 넣는 것입니다.
NSObject* (또는 파생) 또는 원시 값 (NSINTEGER, BOOL 등) 이외의 것을 사용하는 코드는 OCMock을 사용하여 테스트하는 것이 거의 불가능하다는 것을 알게되었습니다.
다른 팁
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:nil]];
또는
NSError* someError = ...
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:someError]];
당신은 또한 할 수 있습니다
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg anyPointer]];
그러나 코드가 실제 nserror를 다시 전달했다고 잘못 생각하게 될 수 있습니다.
ARC를 사용하면 방법 선언이 다음과 같습니다.
- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError *__autoreleasing *)error;
다음은 이러한 유형의 방법을 조롱하는 방법입니다.
BOOL mockDoSomething = YES;
NSError __autoreleasing *error = nil;
[[[mock stub] andReturn:someDict] uploadValues:OCMOCK_VALUE(mockDoSomething) error:&error];
NSError *__autoreleasing *err = (NSError *__autoreleasing *) [OCMArg anyPointer];
[[[_mockReporter stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})]
yourMethodCall:err];
이 상황을 돕기 위해 Ocmarg에 카테고리를 만들었습니다.
Ocmarg+helpers.h :
@interface OCMArg (Helpers)
+ (NSError *__autoreleasing *)anyError;
@end
Ocmarg+helpers.m :
@implementation OCMArg (Helpers)
+ (NSError *__autoreleasing *)anyError {
return (NSError *__autoreleasing *)[OCMArg anyPointer];
}
@end
그런 다음 오류가있을 때마다 조롱해야합니다. anyError
, 그렇게 :
[[myMock stub] someMethodWithArg:anArg error:[OCMArg anyError]];
제휴하지 않습니다 StackOverflow