如何在 Swift 中对这个自定义 UITextField 进行单元测试?

Posted

技术标签:

【中文标题】如何在 Swift 中对这个自定义 UITextField 进行单元测试?【英文标题】:How to unit-test this custom UITextField in Swift? 【发布时间】:2015-08-07 23:05:03 【问题描述】:

我已经创建了一个这样的自定义 UITextField

import Foundation
import UIKit

class NoZeroTextField: UITextField, UITextFieldDelegate 
    required init(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        self.delegate = self
    

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 
    if (string == "0" ) 
        //ignore input
        return false
    
        return true
    

我正在尝试为该类编写单元测试,但问题在于将 NSCoder 实例传递给构造函数。我无法实例化它或将其设置为零。如何对这个类进行单元测试?

【问题讨论】:

你的textField方法是内部的,不用NSCoder构造函数直接测试一下? “直接”是什么意思? 【参考方案1】:

我想通了。被测类:

import Foundation
import UIKit

public class CustomTextField: UITextField, UITextFieldDelegate

required public init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)
    self.delegate = self


 public func textField(textField: UITextField, shouldChangeCharactersInRange   range: NSRange, replacementString string: String) -> Bool 
    if (string == "X" )
        //ignore input
        return false
    
    return true



测试本身:

import UIKit
import XCTest
import TryCustom
import Foundation

class CustomTextFieldTests: XCTestCase 

  func testCustomTextField() 
    //pass in dummy non abstract NSCoder (NSKeyedUnarchiver)
    let cd = NSKeyedUnarchiver(forReadingWithData: NSMutableData())
    let c = CustomTextField(coder:cd)
    let result = c!.textField(c!, shouldChangeCharactersInRange: NSRange(), replacementString: "X")
    XCTAssertFalse(result)
  

【讨论】:

以上是关于如何在 Swift 中对这个自定义 UITextField 进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

想知道如何以编程方式在 swift 3.0 中对 UITableViewCell 进行子类化?

Swift 之自定义 UIAlertController

iOS Swift delegate的使用

Alamofire - 带有自定义标头的 Rest API 调用

如何在 Swift 中对字体进行样式化?

如何在 Swift 中对图像应用过滤器?