使用 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 实际初始化变量,因此只有那个副本有值。
简单问题:我正在尝试使用 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 实际初始化变量,因此只有那个副本有值。