OCMock передает любой CGSize

Я использую OCMock и пытаюсь сделать что-то подобное в одном из своих тестов:

[[mockScrollView expect] setContentSize:[OCMArg any]];

Проблема в том, что [OCMArg any] возвращает тип id, а я хочу использовать любой CGSize, потому что не знаю его точного значения. Как я могу передать этот аргумент?


person Andra Todorescu    schedule 04.06.2013    source источник
comment
Это проблема с OCMock. Тем не менее, насмешка над представлением обычно не требуется. Чего вы пытаетесь достичь?   -  person Christopher Pickslay    schedule 07.06.2013


Ответы (3)


С версией 2.2 OCMock вы можете использовать ignoringNonObjectArgs

[[mockScrollView expect] ignoringNonObjectArgs] setContentSize:dummySize];
person Andreas Järliden    schedule 04.07.2013

Насколько я знаю, с OCMock этого сделать невозможно.

Альтернативой является создание макета ручной работы. Это подкласс UIScrollView, где вы переопределяете setContentSize:, назначая заданный размер ivar, который позже вы можете проверить.

Другой более простой вариант - использовать настоящий UIScrollView и напрямую проверить, является ли contentSize тем, который вы ожидаете. Я бы пошел на это решение.

person e1985    schedule 04.06.2013
comment
Я согласен с тем, что проверка результата изменения размера контента — хороший способ сделать это. - person Ben Flynn; 04.06.2013

К сожалению, похоже, что для этого вам придется расширить OCMock. Вы можете следовать этому шаблону...

OCMArg.h

// Add this:
+ (CGSize)anyCGSize;

OCMArg.c

// Add this:
+ (CGSize)anyCGSize
{
    return CGSizeMake(0.1245, 5.6789);
}

// Edit this method:
+ (id)resolveSpecialValues:(NSValue *)value
{
    const char *type = [value objCType];

    // Add this:
    if(type[0] == '{')
    {
        NSString *typeString = [[[NSString alloc] initWithCString:type encoding:NSUTF8StringEncoding] autorelease];
        if ([typeString rangeOfString:@"CGSize"].location != NSNotFound)
        {
            CGSize size = [value CGSizeValue];
            if (CGSizeEqualToSize(size, CGSizeMake(0.1245, 5.6789)))
            {
                return [OCMArg any];
            }
        }
    }

    // Existing code stays the same...
    if(type[0] == '^')
    {
        void *pointer = [value pointerValue];
        if(pointer == (void *)0x01234567)
            return [OCMArg any];
        if((pointer != NULL) && (object_getClass((id)pointer) == [OCMPassByRefSetter class]))
            return (id)pointer;
    }
    return value;
}
person Ben Flynn    schedule 04.06.2013