【问题标题】:Unit testing the value of a static constant using XCTest?使用 XCTest 对静态常量的值进行单元测试?
【发布时间】:2016-01-04 15:11:06
【问题描述】:

简单的问题:我正在尝试使用 XCTest 来声明一些 static 常量的值 - 我的 QA 工程师要求我这样做,以防另一位工程师进入并手动更改它们。

令我惊讶的是,我正在编写一个超级简单的断言,以确保该值是我设置的硬编码值,在本例中为 768.0f,但测试失败,并将其视为零。

.h 文件中:

static CGFloat const BLABannerViewExpectedWidthPad;

.m 文件中:

static CGFloat const BLABannerViewExpectedWidthPad = 768.0f

这些在 @interface@implementation 块之外,通常在 Objective-C 中声明它们。

测试:

- (void)test_constants {
    XCTAssertEqual(BLABannerViewExpectedWidthPad, 768.0f);
}

这失败了,0 is not equal to 768

很奇怪,我是在做一些愚蠢的事情,还是我们不能对此进行单元测试?

【问题讨论】:

  • 顺便说一句:根据屏幕尺寸硬编码任何元素的宽度是非常不受欢迎的。
  • 我知道,我们正在为继承的应用程序进行准系统 6 / 6+ 兼容性更新,然后再进行更重的重构:)
  • 对于相等的浮点数也(答案已发布)使用 XCTAssertEqualWithAccuracy 而不是 XCTAssertEqual

标签: objective-c unit-testing assert xctest


【解决方案1】:

常量需要在标头中定义为extern,而不是在任何一个文件中都是静态的。

*.h:

extern CGFloat const BLABannerViewExpectedWidthPad;

*.m:

CGFloat const BLABannerViewExpectedWidthPad = 786.0;

它的工作方式是extern 告诉当前编译单元(导入头文件的文件)在某个地方有一个具有给定定义的变量。编译器相信你的话,并把和解留给链接器。

链接器使用给定符号(在 *.m 中)找到一个实际的存储定义,并修复所有用户中的地址以引用相同的存储。

当您将全局变量定义为 static 时,您将其范围限制为当前编译单元 (*.m)。这会隐藏链接器看到的全局符号列表中的符号。当这在包含在许多编译单元 (*.m) 中的头文件中完成时,每个单元都会获得自己的同名私有符号。由于只有一个 *.m 实际初始化了变量,因此只有该副本具有值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 2017-02-16
    • 2020-09-06
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多