使用 XCTest 对静态常量的值进行单元测试?

Unit testing the value of a static constant using XCTest?

简单问题:我正在尝试使用 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

很奇怪,我是不是在做傻事,或者我们不能对它进行单元测试吗?

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

*.h:

extern CGFloat const BLABannerViewExpectedWidthPad;

*.m:

CGFloat const BLABannerViewExpectedWidthPad = 786.0;

它的工作方式是 extern 告诉当前编译单元(导入 header 的文件)某处有一个具有给定定义的变量。编译器相信您的话,并将协调留给链接器。

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

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