[英]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.