Swift 在测试用例期间无法从框架强制转换到协议

Swift 在测试用例期间无法从框架强制转换到协议,swift,xctest,Swift,Xctest,所以我有一个来自我们内部框架的类。其定义如下: // This lives within a framework class ExternalClass: ExternalClassProtocol { // implementation here } // This lives within my test target class MockExternalClass: ExternalClassProtocol { // Mock implementation here }

所以我有一个来自我们内部框架的类。其定义如下:

// This lives within a framework
class ExternalClass: ExternalClassProtocol {
    // implementation here
}

// This lives within my test target
class MockExternalClass: ExternalClassProtocol {
    // Mock implementation here
}

// This lives within the same external frame work as ExternalClass
protocol ExternalClassProtocol: AnyObject {
   // Protocol methods here  
}
在我的测试用例中,如果我尝试将MockExternalClass转换为?ExternalClassProtocol,测试用例崩溃

但是,在live app运行时,将ExternalClass转换为?外部类协议

这是从外部模块实现协议的问题吗?有办法解决这个问题吗

通过依赖项注入访问该类(请参见下面的依赖项注入实现)。崩溃发生在resolve函数上

如果实际调试到此为止,可以看到模拟依赖项位于我的依赖项根目录(下面的服务数组)中。

所以我知道它不会因为缺少依赖项而失败

@propertyWrapper
struct Injected<Value> {
    var key: String

    var wrappedValue: Value {
        get { return Dependency.root.resolve(key: self.key) }
        set { Dependency.root.add(key: self.key, newValue) }
    }

    init(key: String) {
        self.key = key
    }
}


class Dependency {
    static let root = Dependency()

    var services: [String : Any] = [:]

    func add<T>(key: String, _ service: T) {
        services[key] = service
    }

    func resolve<T>(key: String) -> T {
        guard let component: T = services[key] as? T else {
            // The test crashes here. It works fine on other mocks that are internal to the project
            fatalError("Dependency '\(T.self)' not resolved!")
        }

        return component
    }

    func clearDependencies() {
        self.services.removeAll()
    }

    private init() {}
}
我尝试过的一些事情:

向协议添加AnyObject(这修复了我模拟的内部定义类的类似问题)

将mockExternalClass类型更改为协议 将mockExternalClass类型更改为实现

除了在我们的一个POD中定义一个协议外,外部协议和我们在自己的项目中定义的协议之间没有区别

我注意到的一件事是,如果在我的一个测试用例函数中设置了断点,则强制转换不会失败。但是,如果在Dependency.resolve函数中尝试相同的强制转换,它将崩溃。这让我相信泛型有一个问题


有什么想法吗?

致命错误可能是因为
服务
数组中缺少该项目,也可能是因为该项目在那里,但类型不正确而导致的。尝试重新组织代码,以便知道导致致命错误的原因。@Rudedog,正如我在原始帖子中提到的。服务阵列中没有丢失它。问题是,它未能投出。特别是在该解析函数中。如果您尝试在测试用例中执行强制转换,那么它可以很好地执行强制转换。它是否可能因为使用泛型而失败?或者可能是因为协议没有在主应用程序中定义,而是在我的一个POD中定义?
@testable import MyProject
import ExternalDependency

class TestCase: XCTestCase {
    private var subject: ClassWithService!
    private var mockInternalClass: MockInternalClassProtocol!
    private var mockExternalClass: MockInternallClassProtocol!

    func setUp() {
        mockExternalClass = MockExternalClass() // This one crashes when trying to cast to its parent protocol
        mockInternalClass = MockInternalClass() // This one does not crash when casting to parent protocol.
        Dependency.root.add(key: "internal_class", mockInternalClass)
        Dependency.root.add(key: "external_class", mockExternalClass)
    }
}