OCMock传递任何CGSize

时间:2013-06-04 11:00:51

标签: ios unit-testing primitive-types ocmock cgsize

我正在使用OCMock,我正试图在我的一个测试中做到这样的事情:

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

问题是[OCMArg any]会返回id类型,我想使用任何CGSize,因为我不知道它的确切值。我怎么能通过这个论点?

3 个答案:

答案 0 :(得分:5)

使用OCMock 2.2版,您可以使用ignoringNonObjectArgs

[[mockScrollView expect] ignoringNonObjectArgs] setContentSize:dummySize];

答案 1 :(得分:2)

AFAIK无法通过OCMock实现这一目标。

另一种方法是创建一个手工制作的模拟。这是UIScrollView的子类,您可以覆盖setContentSize:将给定大小分配给稍后可以检查的ivar。

其他更简单的选择是使用真实UIScrollView并直接检查是contentSize是您期望的那个。我会选择这个解决方案。

答案 2 :(得分:1)

可悲的是,看起来你必须扩展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;
}
相关问题