以编程方式测试视图约束(在单元测试中)

Posted

技术标签:

【中文标题】以编程方式测试视图约束(在单元测试中)【英文标题】:Testing views constraints programmatically ( In Unit test ) 【发布时间】:2019-08-07 12:20:37 【问题描述】:

我没有在 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.y414 但值 subject.getFooterView( ).frame.origin.y 总是

所有其他属性也是如此,例如 frame.size.width 等,对于我的页脚来说总是

谁能帮我理解这个?

【问题讨论】:

【参考方案1】:

这没有给您想要的结果的原因是因为 AutoLayout 的工作方式。在调用 View Controller 的 viewDidLayoutSubviews 方法之前,您将无法访问 frame.size.width 值,如果您正在测试,您可能在调用此方法之前运行此测试。

看看这个答案here。

他提到尝试 setNeedsLayout 后跟 layoutIfNeeded?

【讨论】:

这正是缺少的!谢谢!

以上是关于以编程方式测试视图约束(在单元测试中)的主要内容,如果未能解决你的问题,请参考以下文章

编写单元测试:如何以编程方式获取包含测试文件的文件夹

swift - 快速按下集合视图单元格时如何修复自定义视图中的约束

单元格子视图约束在 CellForRowAtIndex 中以编程方式更改

Django单元测试测试视图问题,怎么解决

如何从视图中删除“@oidc.login_required”以进行单元测试?

Swift - StackView 和添加约束,以编程方式添加视图到堆栈 - 加载后调整单元格高度?