我已经以编程方式构建了所有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 等),我的页脚始终为零。
有人可以帮助我理解这一点吗?
答案 0 :(得分:1)
之所以没有给您想要的结果,是因为AutoLayout的工作原理。直到调用View Controller的viewDidLayoutSubviews方法之后,您才能访问frame.size.width值;如果要进行测试,则可能在调用此方法之前运行此测试。
看看这个答案here。
他提到先尝试setNeedsLayout,然后再尝试layoutIfNeeded?