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

时间:2019-08-07 12:20:37

标签: swift unit-testing

我已经以编程方式构建了所有UI,而没有在Xcode中使用IB。现在,我想断言约束在我的单元测试中是正确的(是的,在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

现在我想在单元测试中对此进行测试。我可以断言页脚不是nil,并且它具有预期的属性(尺寸除外),因为它们始终显示为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 等),我的页脚始终为

有人可以帮助我理解这一点吗?

1 个答案:

答案 0 :(得分:1)

之所以没有给您想要的结果,是因为AutoLayout的工作原理。直到调用View Controller的viewDidLayoutSubviews方法之后,您才能访问frame.size.width值;如果要进行测试,则可能在调用此方法之前运行此测试。

看看这个答案here

他提到先尝试setNeedsLayout,然后再尝试layoutIfNeeded?