【问题标题】:How can I unit test this hitTest override in iPhone?如何在 iPhone 中对这个 hitTest 覆盖进行单元测试?
【发布时间】:2011-12-19 11:35:44
【问题描述】:

如何对 hitTest 覆盖进行单元测试?

- (UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView* hitView = [super hitTest:point withEvent:event];
    // Do something based on hitView's properties
}

我面临的问题是UIEvent 没有公共构造函数,因此我无法创建UIEvent 以在[super hitTest:point withEvent:event] 上产生不同的结果。

或者,我可以创建一个模拟 UIEvent,但这意味着知道 [super hitTest:point withEvent:event] 用它做什么,而我不知道,即使我知道,它也可能会改变。

另一种选择是混合[super hitTest:point withEvent:event](与OCMock),但我不知道是否可以只混合超类实现。

【问题讨论】:

    标签: iphone ios unit-testing hittest ocmock


    【解决方案1】:

    您可以包装对 super 的调用并使用部分模拟。

    在被测类中,创建如下内容:

    -(UIView *)checkHit:(CGPoint)point withEvent:(UIEvent *)event {
        return [super hitTest:point withEvent:event];
    }
    

    然后在你的测试类中:

    CGPoint testPoint = CGPointMake(1,2);
    id mockHitView = [OCMockObject mockForClass:[UIView class]];
    id mockSomething = [OCMockObject partialMockForObject:realObject];
    [[[mockSomething stub] andReturn:mockHitView] checkHit:testPoint withEvent:[OCMArg any]];
    
    [realObject hitTest:testPoint withEvent:nil];
    

    【讨论】:

    • +1 虽然这可行,但它迫使我创建一种方法,使代码更加混乱。我不反对为测试目的添加代码,只要它使代码更清晰(幸运的是,它通常会这样做)。
    猜你喜欢
    • 2013-07-08
    • 2016-05-04
    • 2011-03-14
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2018-03-30
    • 2018-10-29
    • 1970-01-01
    相关资源
    最近更新 更多