gpt4 book ai didi

ios - 如何从单元测试类访问静态变量?

转载 作者:行者123 更新时间:2023-11-29 11:58:53 25 4
gpt4 key购买 nike

我的 School 类实现文件中有一个静态变量 COURSE_NAME:

头文件:

@interface School {
...
}
@end

在实现文件中:

static NSString *COURSE_NAME = @"secret-course";
@implementation School
...
@end

我为学校创建了一个单元测试类。

@interface SchoolTest : XCTestCase
@end

@implementation SchoolTest

- (void)setUp {
[super setUp];
...
}

- (void)tearDown {
...
[super tearDown];
}

- (void)testSomeFunc {
// how can I access the static variable 'COURSE_NAME'
// in School implementation file?
}

有没有一种方法可以从单元测试类访问School实现文件中定义的静态变量COURSE_NAME,而无需将此静态变量暴露给School 的公共(public)接口(interface)?

(如果答案是否定的,那么,从其单元测试类访问类的静态变量的最佳实践是什么?要进行什么样的重构?如果唯一的解决方案是声明 COURSE_NAME 是非静态的,那么为我的测试用例重构代码的最佳实践是什么?通常 COURSE_NAME 是一个常量字符串,不会改变。)

最佳答案

在 Objective-C 中无法访问 C 风格的静态变量,因为它们的名称是翻译单元 的本地名称——一种对 .m 文件的奇特说法。 COURSE_NAME 的名称不可用于链接器,这意味着您无法在声明它们的 .m 文件之外访问它们。

您可以采用三种方法对依赖于静态变量的代码进行单元测试:

  1. 测试依赖于 COURSE_NAME 变量的公共(public)方法,并以间接方式检查该变量是否具有正确的值。
  2. 制作一个返回变量值的非静态全局测试函数,并在单元测试中使用该测试函数
  3. 向您的类中添加一个类方法(使用 + 而不是 - 在其名称前面),并使用它来访问您的静态变量的值。

由于翻译单元静态变量对您的实现是私有(private)的,#1 提供了最佳方法,因此您的单元测试不依赖于类的实现细节。

您实现方法 #1 的实际方式取决于您的代码使用 COURSE_NAME 值的方式。

例如,假设您使用 COURSE_NAME 作为必修类(class)的名称,除非该类(class)已经在列表中,否则该必修类(class)始终添加到学生想要修读的类(class)列表中。然后你应该编写一个单元测试,提供一个没有 secret 类(class)的类(class)列表,在方法运行后获取更新的类(class)列表,并添加一个检查 "secret-course" 是否在其中结果。您还应该添加另一个包含 "secret-course" 的测试,并验证在这种情况下没有添加新类(class)。

关于ios - 如何从单元测试类访问静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37898436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com