2012-04-24 15 views
6

Czy ktoś wie, jak przechwycić argument wysłany do obiektu OCMock?Jak przechwycić argument wysłany na próbę?

id mock = [OCMockObject mockForClass:someClass] 
NSObject* captureThisArgument; 
[[mock expect] foo:<captureThisArgument>] 

[mock foo:someThing] 
GHAssertEquals[captured, someThing, nil]; 

Jak przejść do sprawdzania poprawności argumentu do foo? Cieszę się, że mogę to zrobić również w bloku w fałszywej definicji, ale jeśli zdołalibyśmy wydobyć obiekt, bym mógł stwierdzić na jego podstawie, to byłoby genialnie.

Czy to możliwe z OCMockiem?

Odpowiedz

9

Jeśli chcesz potwierdzić swój parametr może można to zrobić bezpośrednio podczas ustawiania niedopałek z czymś takim:

id mock = [OCMockObject mockForClass:someClass]; 
NSObject* captureThisArgument; 
[[mock expect] foo:[OCMArg checkWithBlock:^(id value){ 
    // Capture argument here... 
}]]; 

Pozdrawiam, Quentin A

+0

Podoba mi się to. Jest podobny do tego, w jaki sposób kpiłbym z hancrest matchera. Dzięki :). –

3

Można skrótową połączenie i przekazać go do bloku, który sprawdza go:

NSObject *expected = ...; 

id mock = [OCMockObject mockForClass:someClass] 
void (^theBlock)(NSInvocation *) = ^(NSInvocation *invocation) { 
    NSObject *actual; 
    [invocation getArgument:&actual atIndex:2]; 
    expect(actual).toEqual(expected); 
}; 
[[[mock stub] andDo:theBlock] foo:[OCMArg any]]; 

[mock foo:expected]; 

Jest też wersja zwrotna o tym, ale przepływ sterowania staje się bardziej skomplikowane, jak trzeba zmienną stanu, który jest widoczny zarówno do badania i zwrotnego weryfikacja:

[[[mock stub] andCall:@selector(aMethod:) onObject:anObject] someMethod:someArgument] 
+1

Dzięki. Odpowiedź @ Quentina była zwięzła, na którą liczyłam, ale naprawdę doceniam twój przykład. Dobrze jest mieć przykład sprawdzania poprawności wielu argumentów w szyderczym czasie. (Wrzuciłbym twierdzenia do Billa, gdyby coś było nie tak). –

+0

Pierwsze dwa argumenty NSInvocation są zarezerwowane dla self i _cmd; "pierwszy" argument metody jest na poziomie 2. – titaniumdecoy

+0

Dobry połów @titaniumdecoy. Zaktualizowałem moją odpowiedź. –

Powiązane problemy