簡體   English   中英

如何為按鈕點擊編寫單元測試?

[英]How to write unit test for button tap?

在這里,我正在嘗試檢查視圖控制器的單元測試用例。 - 我有一個帶有按鈕和標簽的視圖控制器。 - 當你點擊按鈕時,它會調用另一個方法。 它將數據提供給按鈕操作標簽文本更改。
- 我想檢查那個按鈕是否觸發了那個方法? 不添加函數的任何布爾值或返回類型。

這是我的代碼。

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

    }

在另一個回應中找到類似的內容,是否嘗試過類似的事情? 來源: 如何在“單元測試”中為按鈕添加點擊動作並顯示警報

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

讓我知道它是否有效!

我已經嘗試過如下,它通過了測試。 但是我不確定這是正確的還是錯誤的?

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

你有沒有嘗試過如下。

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

您所缺少的:

確保在某處調用loadViewIfNeeded()

這可以在測試中,也可以在setUp() 這將加載您的商店,並調用viewDidLoad()

然后,盡可能地測試調用操作的結果 ,而不是是否調用方法。 您已經在示例斷言中做到了這一點。

我還要補充一點,按鈕的正確操作幾乎總是.touchUpInside ,而不是.touchDown 這允許用戶按下按鈕,然后拖動以改變主意。 “我根本不想推動這一點。”

用於 UIViewController 測試的按鈕上的假點擊操作。

通過使用此助手tap(_:) ,您可以驗證您的按鈕是否執行了您在測試 ViewController 時所期望的 @IBAction。

public func tap(_ button: UIButton) {
  button.sendActions(for: .touchUpInside)
}
// Button in your UIViewController
@IBOutlet weak var primaryButton: UIButton!

// In your XCTest subclass
var sut: UIViewController!

tap(sut.primaryButton) // example of use in your test() function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM