【问题标题】:Objective C - OCMock expect a method that has a block argument?Objective C - OCMock 期望一个具有块参数的方法?
【发布时间】:2014-02-11 23:09:51
【问题描述】:

我有一个接受字符串和完成块参数的方法。 我只关心字符串参数,但是OCMockObject抛出异常,我应该传递什么作为块参数?

我的协议

@protocol SomeService <NSObject>

- (void)fetchDataForUsername:(NSString *)username andCompletion:(void (^)(NSArray *someData, NSError *error))completion;

@end

我的测试

OCMockObject *mock = [OCMockObject niceMockForProtocol:@protocol(SomeService)];
[[mock expect] fetchDataForUsername:@"SPECIFIC_USERNAME" andCompletion:[OCMArg any]];

错误日志

**-[OCMAnyConstraint copyWithZone:]: unrecognized selector sent to instance 0xdc79750**

【问题讨论】:

    标签: objective-c objective-c-blocks ocmock


    【解决方案1】:

    我在模拟协议方面也遇到了一些问题。在一般情况下,OCMock 很乐意处理块参数:

    // Foo
    + (void)blockTest
    {
        [UIView animateWithDuration:10.0 animations:^{
            [[[[UIApplication sharedApplication] windows][0] rootViewController] view].alpha = 0.5;
        }];
    }
    
    // Test -- this works fine!
    - (void)testBlock
    {
        id viewMock = [OCMockObject mockForClass:UIView.class];
        [[viewMock expect] animateWithDuration:10.0 animations:OCMOCK_ANY];
    
        [Foo blockTest];
        [viewMock verify];
    

    }

    为了解决协议模拟的问题,我创建了一个实现协议的虚拟类(使用空方法),然后模拟该类的方法并像使用任何其他模拟对象一样使用它。

    【讨论】:

    • 啊啊啊,没想到这是问题所在。会试一试。谢谢
    • 我仍然没有得到问题,我的协议继承了包含 copyWithZone: 的 NSObject 协议。所以我认为模拟会知道这种方法。也许 OCMock 会忽略子协议?
    • NSObject 类定义了copyWithZone:,但我实际上并没有看到它在 NSObject 协议中定义。在正常情况下,组合协议看起来应该可以正常工作(我测试了我自己的协议,也能够从 NSObject 获得zone)。在被测代码中必须有一个隐含的假设,即对象继承自 NSObject 而不仅仅是协议的严格实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    相关资源
    最近更新 更多