微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XCTestCase 用于打开相机和照片库

如何解决XCTestCase 用于打开相机和照片库

我编写了一个可重用的类来打开相机和照片库,如下所示

SalaryController

我需要编写用于打开相机和照片库的测试用例。关于编写与相机或照片库相关的测试用例的任何信息?任何示例代码都会有所帮助。

解决方法

您可以对此进行单元测试,但不能使用直接依赖于全局状态的代码。相反,我认为这些是我们想要控制的界限。然后设计测试,让您指定可用的源类型。生产代码需要进行一些更改以支持此边界。

例如,CameraAndPhotoManager 可以定义一个闭包属性。默认情况下,闭包具有生产代码的正常行为:

var isSourceTypeAvailable: (UIImagePickerController.SourceType) -> Bool =
    { UIImagePickerController.isSourceTypeAvailable($0) }

调用这个闭包而不是直接调用 UIImagePickerController.isSourceTypeAvailable(_:)。单元测试不会检查默认闭包,因此请务必进行手动测试以确认此更改有效。

现在测试代码可以替换闭包了。要测试 present(_:animated:completion),请使用 ViewControllerPresentationSpy。然后我们可以为每个函数编写两个测试。

func test_camera_withCameraUnavailable_shouldRememberCurrentVCButNotPresentImagePicker() throws {
    let presentationVerifier = PresentationVerifier()
    let sut = CameraAndPhotoManager()
    sut.isSourceAvailable = {
       guard case $0 == .camera else { return false } // Make sure it's camera
       return false // camera unavailable
    }
    let vc = UIViewController()

    sut.camera(vc: vc)

    XCTAssertTrue(sut.currentVC === vc,"Expected currentVC \(vc),but was \(sut.currentVC)"
    XCTAssertEqual(presentationVerifier.presentedCount,"presented count")
}

func test_camera_withCameraAvailable_shouldRememberCurrentVCAndPresentImagePicker() throws {
    let presentationVerifier = PresentationVerifier()
    let sut = CameraAndPhotoManager()
    sut.isSourceAvailable = {
       guard case $0 == .camera else { return false }
       return true // camera available
    }
    let vc = UIViewController()

    sut.camera(vc: vc)

    XCTAssertTrue(sut.currentVC === vc,but was \(sut.currentVC)"
    let nextVC: UIImagePickerController? = presentationVerifier.verify(
        animated: true,presentingViewController: vc
    )
    // Now examine the properties of nextVC. For example:
    XCTAssertEqual(nextVC?.sourceType,.camera,"sourceType")
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。