2016-10-17 3 views
0

OCMock에 대한 문서는 훌륭하고 명확합니다. 내 특정 클래스 수준의 함수 stubbed 있습니다. 그것은 요청에 대해, 그리고이 같은 외모 : 나는 [OCMArg invokeBlockWithArgs:@(1), @[@(apiRequestCount)], requestOperation, [[NSError alloc] init], @(0), nil]입니다에 관심함수의 블록을 OCMock으로 스텁하여 증분 값을 반환하려면 어떻게해야합니까?

OCMStub([self.mockApiManager 
    requestToURL:[OCMArg any] 
    method:[OCMArg any] 
    keypath:[OCMArg any] 
    parameters:[OCMArg any] 
    objectClass:[OCMArg any] 
    shouldRetry:NO 
    retryBlock:nil 
    withCompletionBlock:([OCMArg invokeBlockWithArgs:@(1), @[@(apiRequestCount)], requestOperation, [[NSError alloc] init], @(0), nil])])._andDo(^(NSInvocation *invocation) { 

     apiRequestCount++; 
}); 

부분을. 특히 apiRequestCount에서 전달하는 곳.

apiRequestCount는 테스트 클래스의 정적 인 int입니다. 내가 원하는 것은 -requestToURL:metho... 함수가 호출되거나 매입 될 때마다 증가 된 값을 되 돌리는 것이다. 그걸 한 번 호출하면 0을 반환합니다. 두 번째로 호출하면 1을 반환합니다.

그러나이 함수가 3 번 스터브되었지만 invokeBlockWithArgs에 0을 얻습니다. 누구든지이 문제를 해결할 방법을 생각할 수 있습니까?

답변

1

스텁을 만들고 OCMArg에서 invokeBlockWithArgs 메서드를 호출하면 모든 인수 (apiRequestCount 포함)가 취해지고 뒤에서 개체에 보관됩니다. apiRequestCount에 대한 추가 업데이트는 해당 내부 상태를 업데이트하지 않으므로 블록은 처음에 제공된 것과 동일한 값으로 호출됩니다.

즉, invokeBlock 방법은 편의를위한 것입니다. 귀하의 경우 블록 매개 변수에 [OCMArg any]을 전달하여 스텁이 일치하는지 확인할 수 있습니다. 그런 다음 andDo에 전달하는 블록에서 NSInvocation에서 완료 핸들러 블록을 추출하고 올바른 값으로 호출 할 수 있습니다.

관련 문제