OCMock传递任何CGSize(OCMock passing any CGSize)

2019-10-18 05:41发布

我使用OCMock我试图做在我的测试之一是这样的:

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

问题是, [OCMArg any]返回一个id类型,我想用任何CGSize ,因为我不知道它的确切价值千万。 如何传递这个说法?

Answer 1:

随着OCMock的2.2版本,你可以使用ignoringNonObjectArgs

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


Answer 2:

据我所知是没有办法来实现这一目标与OCMock。

另一种方法是创建一个手工制作的模拟。 这是一个子类UIScrollView ,你重写setContentSize:分配给定大小到以后你可以检查一个伊娃。

其他更容易的选择是使用一个真正UIScrollView和检查是直接的contentSize是你所期望的一个。 我会去为这个解决方案。



Answer 3:

可悲的是,它看起来像你不得不为了完成这个扩展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;
}


文章来源: OCMock passing any CGSize