如何在单元测试中从捆绑包访问文件

bru*_*uno 2 xcode unit-testing bundle swift

我正在进行单元测试,并尝试从 获取文件bundle,但在网上let bundle = Bundle(for: type(of: SecCertificate)我收到错误:

无法将类型“SecCertificate.Type.Type”的值转换为预期参数类型“AnyClass”(又名“AnyObject.Type”)

enum CertificatesMock: CertificatesType {

    case myWebUrl

    var host: [String] {

        switch self {
        case .myWebUrl:
            return ["https://my.web.url/"]
        }
    }

    var certificates: SecCertificate {

        switch self {
        case .myWebUrl:

            let bundle = Bundle(for: type(of: SecCertificate))
            return CertificatesMock.certificate(filename: "myWebUrl", bundle: bundle)
        }
    }

    private static func certificate(filename: String, bundle: Bundle) -> SecCertificate {

        if let filePath = bundle.path(forResource: filename, ofType: "cer") {

            do {

                let data = try Data(contentsOf: URL(fileURLWithPath: filePath))
                let certificate = SecCertificateCreateWithData(nil, data as CFData)!

                return certificate

            } catch {

                fatalError(CertificatesError.noCertificateFound.description + ": " + filename)
            }

        } else {

            fatalError(CertificatesError.noCertificateFound.description + ": " + filename)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我的UnitTests目标中有该文件,但不知道如何访问它。

πte*_*ter 5

您正在尝试从枚举访问捆绑包,但根据您的错误,它只能从对象访问AnyClass

无法将“CertificatesMock.Type”类型的值转换为预期参数类型“AnyClass”(又名“AnyObject.Type”)

枚举(在您的情况下是CertificatesMock)不符合AnyClass,因此会出现错误。一种解决方法是定义一个具有bundle属性的类,并从那里检索它。在这种情况下它是有效的,因为BundleClass符合AnyClass

class BundleClass {
    var bundle: Bundle {
        return Bundle(for: type(of: self))
    }
}

// To use it
let bundle = BundleClass().bundle()
Run Code Online (Sandbox Code Playgroud)

人们可能想知道该捆绑包是否可以是静态成员,因为每次需要该捆绑包时都初始化一个新成员并不是很有效,而且它也是无效的。再次,自我将是一个BundleClass.Type“不” AnyClass

无效的!

class BundleClass {
    static var bundle: Bundle {
        return Bundle(for: type(of: self))
    }
}
Run Code Online (Sandbox Code Playgroud)

无法将类型“BundleClass.Type.Type”的值转换为预期参数类型“AnyClass”(又名“AnyObject.Type”)

作为解决方法,您可以在枚举中声明一个类,并使用静态成员使用您创建的类来访问包:

enum CertificatesMock1 {
    class BundleClass {}
    static var fooBundle: Bundle { return Bundle(for: CertificatesMock1.BundleClass.self) }
}
Run Code Online (Sandbox Code Playgroud)

  • 我收到此错误:“无法将‘CertificatesMock.Type’类型的值转换为预期参数类型‘AnyClass’(又名‘AnyObject.Type’)” (2认同)