swift - 以编程方式测试视图约束(在单元测试中)
问题描述
我没有在 Xcode 中使用 IB,而是以编程方式构建了我的所有 UI。现在我想断言约束在我的单元测试中是正确的(是的,不是在 UI 测试中)。
我有一些这样的限制:
footer.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
footer.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
footer.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
footer.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.08).isActive = true
现在我想在我的单元测试中对此进行测试。我可以断言页脚不为零,并且除了尺寸之外它具有预期的属性,因为它们始终显示为 0。例如,这是我尝试过的,但没有奏效:
XCTAssertTrue(subject.getFooterView().frame.origin.y == subject.view.frame.origin.y)
我认为这应该是真的,但它失败了。如果我打印每个属性的值,我可以看到值subject.view.frame.origin.y是414但值subject.getFooterView().frame.origin.y始终为零。
所有其他属性也是如此,例如frame.size.width等,对于我的页脚来说始终为零。
有人可以帮助我理解这一点吗?
解决方案
这没有给您想要的结果的原因是因为 AutoLayout 的工作原理。在调用 View Controller 的 viewDidLayoutSubviews 方法之前,您将无法访问 frame.size.width 值,如果您正在测试,您可能在调用此方法之前运行此测试。
在这里看这个答案。
他提到尝试 setNeedsLayout 后跟 layoutIfNeeded?
推荐阅读
- java - 如何排除测试包并行运行 JUNIT 5?
- c# - 如果条件简化
- sql - 如果范围 SQL 之间缺少任何日期,则在查询结果中添加一行
- node.js - 为每个助手和事件执行函数
- android - 无法在android中一次安装两个应用程序
- asp.net-core - asp .net core 3.1 身份服务器
- sapui5 - 将 ValueHelpDialog 中的 Token 转换为 SAPUI5 中的过滤器
- postgresql - 从 Spring Data Jpa 运行查询时无法获得结果
- reactjs - 在 ReactJS 中导入外部库的最佳方式
- java - 如何在 java 中以有效的方式将数组中的元素写入哈希映射?