用于单元测试 Objective-C XCTest 的 .m 文件中的访问变量定义

Posted

技术标签:

【中文标题】用于单元测试 Objective-C XCTest 的 .m 文件中的访问变量定义【英文标题】:Access Variable Defines in .m file for Unit Testing Objective-C XCTest 【发布时间】:2017-06-16 07:27:57 【问题描述】:

我正在使用 XCTestKit 在我的应用程序中使用 Objective-C 进行单元测试。 我需要在屏幕上测试文本字段的默认值,但 IBOutlets 是在 .m 文件下声明的。

是否有任何方法可以访问这些变量,或任何其他方法来测试 UnitTest 类中的值。

【问题讨论】:

我真的不明白是什么问题。请显示一些示例代码。 您可以使用 Key Value Observing 访问这些值。 【参考方案1】:

假设你的 .m 文件有类似的东西

@interface MyClass ()
@property (nonatomic, strong) IBOutlet UILabel *myLabel;
@end

一种方法是通过复制和粘贴到您的测试文件,在您的测试文件中公开它,但给类别命名:

@interface MyClass (Testing)
@property (nonatomic, strong) IBOutlet UILabel *myLabel;
@end
这种方法的优点是它可以让你的 -public 界面隐藏出口。 缺点是重复意味着如果您更改任何有关属性声明的内容,您必须记住在您的测试文件中重复它。

另一种方法是将您的出口从您的 .m 移动到您的 .h。

这种方法的优点是它承认测试是 API 的有效客户端,并避免重复。 这种方法的缺点是您的 API 中的内容比您希望所有客户端知道的要多。

我更喜欢第二种方法。然后我所做的是通过不将类接口视为“每个人的接口”来软化缺点。相反,我将事物拆分为协议,只公开特定客户端单独他们的交互所需的内容。

【讨论】:

感谢 Jon 的回复,但创建另一个文件不利于将来更改原始文件不会影响测试用例 我不是在谈论制作另一个文件。您可以对现有文件采取任何一种方法。 好的,所以添加(测试)会起作用吗?让我看看这个 要明确一点:这就是您可以复制并粘贴您的插座到您的测试文件的方法。 “Testing”这个名字根本不重要,它只需要一个名字。

以上是关于用于单元测试 Objective-C XCTest 的 .m 文件中的访问变量定义的主要内容,如果未能解决你的问题,请参考以下文章

将 XCTest 与 Objective-C++ 代码一起使用:“Unexpected @ in program”错误

如何使用 XCTest 测试一个 navigationBar 是不是未在 Objective-C 中设置为特定颜色?

单元测试 (XCTest) NIB Outlets 为零

有没有办法使用 XCTest 对 Touch Id 进行单元测试?

使用 XCTest 在单元测试期间接收通知?

iOS 中的 XCTest 和 UI 测试