Как мне захватить аргумент, отправленный на макет?

Кто-нибудь знает, как захватить аргумент, отправленный объекту 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]
Другие вопросы по тегам