如何为协议扩展内的功能编写单元测试?

时间:2018-07-16 21:36:37

标签: ios swift unit-testing protocols

当前我有一个协议:

protocol CameraOpen: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
 func openCamera()
}

该功能在协议扩展中定义:

extension CameraOpen where Self: UIViewController {
 func openCamera() {
        if UIImagePickerController.isSourceTypeAvailable(.camera) {
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = .camera
            imagePicker.allowsEditing = false
            self.present(imagePicker, animated: true, completion: nil)
        }
    }
}

这个问题是我不知道如何实际测试协议扩展中定义的功能。通常,我会创建要测试的类的实例,并使用点表示法来测试该类中的每个函数,但是由于它是协议,因此无法创建它的实例。例如,如果我做这样的事情:

class CamerOpenTests: XCTestCase {

    var cameraOpen: CameraOpen?

    override func setUp() {
        super.setUp()
       cameraOpen = CameraOpen()// error here
    }

    override func tearDown() {
    cameraOpen = nil
        super.tearDown()
    }
}

我收到一个错误:

  

'CameraOpen'无法构造,因为它无法访问   初始化程序

关于如何对该功能进行单元测试的任何想法?

1 个答案:

答案 0 :(得分:2)

即使您可以将代码作为扩展添加到协议中,也无法实例化它,这需要带有协议标记的视图控制器子类。

class CamerOpenTests: XCTestCase {
    class TestCameraOpen : UIViewController, CameraOpen { }

    var cameraOpen: CameraOpen?

    override func setUp() {
        super.setUp()
        cameraOpen = TestCameraOpen()
    }

    override func tearDown() {
        cameraOpen = nil
        super.tearDown()
    }
}