我们可以在unit testing时检查uitextfield的validation吗?

假设我们在ViewController (比如说UItextfield )中对shouldChangeCharactersInRange方法中的shouldChangeCharactersInRange进行了一些validation,因为用户只能输入数字而不是字母或其他特殊字符。

我只是想知道在我们的XCTestCase类中,这是否可以在unit testing中检查特定的uitextfield ,是否允许某些字符(在我的情况下只是数字)?

进行调用shouldChangeCharactersInRangeunit testing,并检查结果应为true或false的期望。

这是如何对委托方法进行unit testing的示例。 在UIKit调用特定方法的地方,只需让测试调用相同的东西。

即使特定的类可以实现委托方法,但如果测试仍然不知道这一点,那就更好了。 UIKit向文本字段询问其委托,然后调用它。 我们的测试也应该这样做,并通过委托调用。 否则我们将锁定实现,这将使重构委托方法变得更加困难。

 func testMyTextField_ShouldAllowAlphabeticCharacters() { let vc = // …Whatever you do to load your view controller vc.loadViewIfNeeded() // Make sure text field is loaded let field = vc.myTextField // Call through field.delegate, not through vc let result = field.delegate.textField(field, shouldChangeCharactersIn: NSMakeRange(0, 1), replacementString: "a") XCTAssertTrue(result) } 

从技术上讲,这不是unit testing,而是UI测试,因为UI的行为不是单位。 但是,您可以在测试中包含UI测试,这些测试将参与测试链。

基本上你得到你想要测试的UI元素( XCUIElement )并向它发送动作,即使用-typeText: . 然后使用XCUIElementAttributes协议将该元素的实际状态与预期状态进行XCUIElementAttributes

谷歌搜索上述标识符将为您提供一些细节。 但是,文档并不是那么好。