【问题标题】:How should I unit test complicated CGRect math?我应该如何对复杂的 CGRect 数学进行单元测试?
【发布时间】:2011-04-29 20:54:52
【问题描述】:

我有一种方法可以对一组 UIView 及其转换执行一些算术运算。单元测试期待一个具体的答案;该程序正在踢出一个 0.0001 的答案,这听起来像是一个我可以处理的小问题。处理这个问题的最佳方法是什么?有没有办法不那么严格?我应该对比较更加挑剔并期望它们完美匹配吗?

相关代码:

//the unit test
CGRect rect0 = CGRectMake(100, 100, 100, 100);
CGRect rect1 = CGRectMake(111, 111, 111, 111);
CGRect rect2 = CGRectMake(-200, -200, 2000, 2000);
CGRect rect3 = CGRectMake(333, -333, 333, 3333);
CGRect rect4 = CGRectMake(4, 4, 4, -4);
CGRect rect5 = CGRectMake(-54, 55, 55, -5555);

CGAffineTransform trans0 = CGAffineTransformIdentity;
CGAffineTransform trans1 = CGAffineTransformIdentity;
CGAffineTransform trans2 = CGAffineTransformMakeScale(2, 2);
CGAffineTransform trans3 = CGAffineTransformMakeScale(-5, 20);
CGAffineTransform trans4 = CGAffineTransformMakeRotation(M_PI / 2);
CGAffineTransform trans5 = CGAffineTransformMakeRotation(34);

CGRect rect0_1 = CGRectUnion(rect0, rect1);
CGRect rect0_2 = CGRectUnion(rect0, CGRectApplyAffineTransform(rect2, trans2));
CGRect rect0_3 = CGRectUnion(rect0, CGRectApplyAffineTransform(rect3, trans3));
CGRect rect0_4 = CGRectUnion(rect0, CGRectApplyAffineTransform(rect4, trans4));
CGRect rect0_5 = CGRectUnion(rect0, CGRectApplyAffineTransform(rect5, trans5));

.
.
.

rectTest = CGRectZero;
rectExpected = rect0_5;
STAssertNoThrow(rectTest = self.testCanvas.selectionBounds, @"Exception when retrieving selection bounds");
STAssertTrue(CGRectEqualToRect(rectTest, rectExpected), @"Selection bounds not correct: %@ vs %@", NSStringFromCGRect(rectTest), NSStringFromCGRect(rectExpected));

//the relevant method
- (CGRect)selectionBounds {
    CGRect selectionRect = CGRectZero;
    CGRect layerFrame;
    NSSet *layers = [self selectedLayers]; //TODO should this be optomized out?
    for(UIView *layer in layers) {
        CGPoint center = CGPointApplyAffineTransform(layer.center, layer.transform);
        layerFrame = layer.bounds;
        layerFrame = CGRectApplyAffineTransform(layerFrame, layer.transform);
        layerFrame = CGRectOffset(layerFrame, center.x - CGRectGetMidX(layerFrame), center.y - CGRectGetMidY(layerFrame));
        if(CGRectIsEmpty(selectionRect)) {
            selectionRect = layerFrame;
        } else {
            selectionRect = CGRectUnion(selectionRect, layerFrame);
        }
    }
    return selectionRect;
}

//the output
[snip]: error: -[CanvasTests testSelectionBounds] : "CGRectEqualToRect(rectTest, rectExpected)" should be true. Selection bounds not correct: {{-29.9481, -75.2419}, {2985.73, 4742.91}} vs {{-29.9481, -75.2418}, {2985.73, 4742.91}}

【问题讨论】:

    标签: iphone ios unit-testing cgrect


    【解决方案1】:

    解决这个问题的最佳方法是什么?有没有办法不那么严格?

    编写一个允许适当公差的比较函数。

    我是否应该对比较更加挑剔并期望它们完美匹配?

    在这种情况下,我会说您观察到的公差/差异是可以接受的(毕竟,它是 fp,并且您所说的偏差是可以接受的)。

    【讨论】:

    • 谢谢!你知道在单元测试中是否有一种标准/典型的方式来使用自定义比较函数?我认为不是,但可以安全地问。 :)
    • 不确定。我自己写的。简单地说:您将乘以并转换为 int。 x、y、w 和 h 都有逻辑域。
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2020-11-06
    • 2011-01-01
    • 2016-09-26
    • 2016-09-18
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多