如何编写按钮点击的单元测试?

时间:2018-12-13 06:52:53

标签: ios swift xctest xctestcase

在这里,我正在尝试检查视图控制器的单元测试用例。 -我有一个带有按钮和标签的视图控制器。 -单击按钮时,它将调用另一种方法。将数据输入按钮操作标签文本更改。
-我想检查按钮是否触发了该方法?而不添加任何布尔或返回类型的函数。

这是我的代码。

class ViewController: UIViewController {

    @IBOutlet weak var buttonFetch: UIButton?

    @IBOutlet weak var nameLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func fetchUser() {
        self.nameLabel.text = self.getUser()
    }

    func getUser() ->String {
        return User.data()
    }
}

struct User  {
    static func data()->String{
        return "Apple"
    }
}

这是我的测试用例

func testFetchUserAction() {
        controller.buttonFetch?.sendActions(for: .touchDown)
        // I want to test the method getUser from viewcontroller gets called or not
        // some thing like this XCTAssert(self.controller.getUser(),"not called")
        XCTAssertEqual(self.controller.nameLabel.text!, "Apple")

    }

4 个答案:

答案 0 :(得分:0)

在另一个响应中找到类似的内容,是否尝试过类似的操作? 来源:How to add tap action for button in "Unit Testing" and show Alert

func testTappingLoginButton_ShouldPresentAlert() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let sut = storyboard.instantiateInitialViewController() as! ViewController
    sut.loadViewIfNeeded()
    let alertVerifier = QCOMockAlertVerifier()

    sut.loginButton.sendActions(for: .touchUpInside)

    XCTAssertEqual(alertVerifier.presentedCount, 1)
}

让我知道它是否有效!

答案 1 :(得分:0)

我尝试过如下测试,它通过了测试。 但是我不确定它是否正确?

XCTAssertNotNil(self.controller!.getUser, "get user method not called")

答案 2 :(得分:0)

您是否尝试过如下操作。

func testFetchUserAction() {

    self.controller.nameLabel.text = nil

    //Use this line, If you assigned touchUpInside to your button action
    controller.buttonFetch?.sendActions(for: .touchUpInside)

    //Use this line, If you assigned touchDown to your button action
    controller.buttonFetch?.sendActions(for: .touchDown)

    XCTAssert(self.controller.nameLabel.text != nil, "not called")

}

注意:要故意使测试用例失败,可以在sendActions中更改UIControl.Event

答案 3 :(得分:0)

您所缺少的:

  

确保在某处致电loadViewIfNeeded()

这可以在测试中,也可以在setUp()中。这将加载您的商店,并致电viewDidLoad()

然后,尽可能地测试调用动作的结果,而不是测试是否调用方法。您已经在示例断言中做到了这一点。

我还要补充一点,按钮的正确操作几乎总是.touchUpInside,而不是.touchDown。这允许用户按下按钮,然后拖动以改变主意。 “我毕竟不想这么做。”