문제

다음과 같은 서명과 동등한 방법을 조롱하려고합니다.

- (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]];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top