如何在单元测试中访问包中的文件
How to access file from bundle in unit tests
我正在做单元测试,我试图从 bundle
获取文件,但在行 let bundle = Bundle(for: type(of: SecCertificate)
上我收到错误:
Cannot convert value of type 'SecCertificate.Type.Type' to expected argument type 'AnyClass' (aka '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)
}
}
}
问题是我的 UnitTests
目标中有那个文件,但不知道如何访问它。
您正在尝试从枚举访问包,但根据您的错误,它只能来自 AnyClass
对象。
Cannot convert value of type 'CertificatesMock.Type' to expected
argument type 'AnyClass' (aka 'AnyObject.Type')
枚举(在您的情况下为 CertificatesMock)将不符合 AnyClass
,因此会出现错误。一种解决方法是定义一个 class 和一个 属性 的包,并从那里检索它。在这种情况下是有效的,因为 BundleClass
符合 AnyClass
class BundleClass {
var bundle: Bundle {
return Bundle(for: type(of: self))
}
}
// To use it
let bundle = BundleClass().bundle()
有人想知道 bundle 是否可以是静态成员,因为每次我们需要 bundle 时都初始化一个新成员并不是很有效,但它也是无效的。同样,自我将是 BundleClass.Type
而不是 AnyClass
.
无效!
class BundleClass {
static var bundle: Bundle {
return Bundle(for: type(of: self))
}
}
Cannot convert value of type 'BundleClass.Type.Type' to expected
argument type 'AnyClass' (aka 'AnyObject.Type')
作为解决方法,您可以在枚举中声明一个 class 并使用静态成员,您可以使用您创建的 class 来访问包:
enum CertificatesMock1 {
class BundleClass {}
static var fooBundle: Bundle { return Bundle(for: CertificatesMock1.BundleClass.self) }
}
我正在做单元测试,我试图从 bundle
获取文件,但在行 let bundle = Bundle(for: type(of: SecCertificate)
上我收到错误:
Cannot convert value of type 'SecCertificate.Type.Type' to expected argument type 'AnyClass' (aka '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)
}
}
}
问题是我的 UnitTests
目标中有那个文件,但不知道如何访问它。
您正在尝试从枚举访问包,但根据您的错误,它只能来自 AnyClass
对象。
Cannot convert value of type 'CertificatesMock.Type' to expected argument type 'AnyClass' (aka 'AnyObject.Type')
枚举(在您的情况下为 CertificatesMock)将不符合 AnyClass
,因此会出现错误。一种解决方法是定义一个 class 和一个 属性 的包,并从那里检索它。在这种情况下是有效的,因为 BundleClass
符合 AnyClass
class BundleClass {
var bundle: Bundle {
return Bundle(for: type(of: self))
}
}
// To use it
let bundle = BundleClass().bundle()
有人想知道 bundle 是否可以是静态成员,因为每次我们需要 bundle 时都初始化一个新成员并不是很有效,但它也是无效的。同样,自我将是 BundleClass.Type
而不是 AnyClass
.
无效!
class BundleClass {
static var bundle: Bundle {
return Bundle(for: type(of: self))
}
}
Cannot convert value of type 'BundleClass.Type.Type' to expected argument type 'AnyClass' (aka 'AnyObject.Type')
作为解决方法,您可以在枚举中声明一个 class 并使用静态成员,您可以使用您创建的 class 来访问包:
enum CertificatesMock1 {
class BundleClass {}
static var fooBundle: Bundle { return Bundle(for: CertificatesMock1.BundleClass.self) }
}