单元测试按钮添加到视图中

时间:2016-07-14 15:05:24

标签: ios swift unit-testing

我是一名单元测试新手,我正在测试我的按钮是否已添加到视图中。

我的第一次测试正确通过:

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")
}

2 个答案:

答案 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建议如何解决这个问题。