我是一名单元测试新手,我正在测试我的按钮是否已添加到视图中。
我的第一次测试正确通过:
XCTAssertNotNil(vc.button, "button Not Initialised")
但是当我在代码
中有view.addSubview(按钮)时,我的第二次测试失败了XCTAssertNotNil(vc.button.superview, "button Not added to view")
我的问题是如何测试以查看按钮是否已添加到视图中,我没有使用故事板,所有内容都已编码。因为无论代码中是否有addSubview,第一次测试都会通过。
由于
在我的ViewController类中,我初始化按钮:
private(set) lazy var myButton: UIButton = {
let myButton = UIButton(frame: CGRectZero)
return myButton
}()
并在viewDidLoad中我将它添加到子视图并给它约束:
view.addSubview(myButton)
我的测试功能是:
func testAddRoomButtonInRoomsViewController() {
let vc = myViewController()
XCTAssertNotNil(vc.myButton, "Button Not Initialised")
XCTAssertNotNil(vc.myButton.superview, "Button Not Added To View")
}
答案 0 :(得分:1)
在您的测试用例中未调用viewDidLoad
,因此失败。你必须手动调用它。
<强> 1。引入扩展
extension UIViewController {
func startViewLifecycle() {
view.setNeedsLayout()
view.layoutIfNeeded()
}
}
<强> 2。在测试用例中调用它:
func testAddRoomButtonInRoomsViewController() {
let vc = myViewController()
vc.startViewLifecycle()
XCTAssertNotNil(vc.myButton, "Button Not Initialised")
XCTAssertNotNil(vc.myButton.superview, "Button Not Added To View")
}
答案 1 :(得分:0)
编写测试以检查视图是否已添加到超级视图是绝对有效的。我刚试过以下内容并成功通过:
- (void)testView
{
UIView *superview = [UIView new];
UIView *view = [UIView new];
[superview addSubview:view];
XCTAssertNotNil(view.superview);
}
如果您的断言XCTAssertNotNil(vc.button.superview, "button Not added to view")
失败,或者是因为您没有将子视图添加到超级视图(这可能是您要测试的内容),或者因为您的超级视图在您完成测试之前被取消分配。
如果是后者,你需要确保对superview进行强有力的引用来执行测试 - superview保持对每个子视图的强引用,但不是相反的方式(因为这会产生一个保留的循环) )。所以view.superview
实际上是一个弱属性,如果/当超级视图被释放时,它将被设置为nil
。
- (void)testView
{
UIView *superview = [UIView new];
UIView *view = [UIView new];
[superview addSubview:view];
superview = nil;
XCTAssertNil(view.superview);//superview will be deallocated by now - this value is nil
}
我希望这会有所帮助。
//更新:
看一下代码,现在很清楚你没有在测试前调用addSubview:
,因为没有调用viewDidLoad
。 @figs建议如何解决这个问题。