如何为协议扩展中的函数编写单元测试?

Swi*_*yJD 0 unit-testing protocols ios swift

目前我有一个协议:

protocol CameraOpen: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
 func openCamera()
}
Run Code Online (Sandbox Code Playgroud)

该函数在协议扩展中定义:

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class CamerOpenTests: XCTestCase {

    var cameraOpen: CameraOpen?

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

    override func tearDown() {
    cameraOpen = nil
        super.tearDown()
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

无法构造“CameraOpen”,因为它没有可访问的初始值设定项

关于如何对这个函数进行单元测试的任何想法?

Vik*_*ica 5

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

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

    var cameraOpen: CameraOpen?

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

    override func tearDown() {
        cameraOpen = nil
        super.tearDown()
    }
}
Run Code Online (Sandbox Code Playgroud)