Как мне захватить аргумент, отправленный на макет?
Кто-нибудь знает, как захватить аргумент, отправленный объекту OCMock?
id mock = [OCMockObject mockForClass:someClass]
NSObject* captureThisArgument;
[[mock expect] foo:<captureThisArgument>]
[mock foo:someThing]
GHAssertEquals[captured, someThing, nil];
Как мне проверить аргумент foo? Я тоже рад сделать это в блоке в определении макета, но если бы я мог вывести объект, чтобы потом утверждать его особенность, это было бы замечательно.
Это возможно с OCMock?
2 ответа
Решение
Если вы хотите проверить свой параметр, может быть, вы можете сделать это напрямую, когда вы устанавливаете заглушку с помощью чего-то вроде:
id mock = [OCMockObject mockForClass:someClass];
NSObject* captureThisArgument;
[[mock expect] foo:[OCMArg checkWithBlock:^(id value){
// Capture argument here...
}]];
С уважением, Квентин А
Вы можете заблокировать вызов и передать его блоку, который его проверяет:
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];
Существует также версия обратного вызова, но поток управления становится более сложным, так как вам нужна переменная состояния, видимая как для вашего теста, так и для обратного вызова проверки:
[[[mock stub] andCall:@selector(aMethod:) onObject:anObject] someMethod:someArgument]