当前我有一个协议:
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'无法构造,因为它无法访问 初始化程序
关于如何对该功能进行单元测试的任何想法?
答案 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()
}
}