在这里,我正在尝试检查视图控制器的单元测试用例。
-我有一个带有按钮和标签的视图控制器。
-单击按钮时,它将调用另一种方法。将数据输入按钮操作标签文本更改。
-我想检查按钮是否触发了该方法?而不添加任何布尔或返回类型的函数。
这是我的代码。
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")
}
答案 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
。这允许用户按下按钮,然后拖动以改变主意。 “我毕竟不想这么做。”