【问题标题】:can we check the validation of uitextfield while Unit Testing?我们可以在单元测试时检查 uitextfield 的验证吗?
【发布时间】:2018-05-03 12:05:29
【问题描述】:

假设我们在shouldChangeCharactersInRange 方法中的UItextfieldViewController(比如vc1)中进行了一些验证,因为用户只能输入数字,不能输入字母或其他特殊字符。

我只想知道,在我们的XCTestCase 类中,这是否可能在单元测试中检查特定的uitextfield,是否允许某些字符(在我的情况下只有数字)?

【问题讨论】:

    标签: ios unit-testing xctest


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      进行调用shouldChangeCharactersInRange 的单元测试并检查结果应该为真或假的预期。

      这是一个如何对委托方法进行单元测试的示例。在 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)
      }
      

      【讨论】:

      • 乔恩,这种方法似乎适用于大多数情况。你知道如何测试markedText的逻辑吗?例如我有这个if textField.markedTextRange != nil { <code here is never called> }
      • @nacho4d 我从未处理过标记文本。我认为您的生产代码中的某些内容正在调用setMarkedText(_:selectedRange:replacementRange:)?您是否确认此生产代码是否由测试触发?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      相关资源
      最近更新 更多