1

我尝试从 UI 测试更改已注册的协议,但它没有改变。我在这里做错了什么?
我有一个共享的 DIAssembler,它使用程序集管理依赖关系,如下所示:

import Swinject

class DIAssembler {
    static let shared = DIAssembler()

    var container: Container
    private let assembler: Assembler

    init() {
        self.container = Container()
        assembler = Assembler(container: container)
        assembler.apply(assembly: ProductionAssembly())

        let processInfo = ProcessInfo.processInfo
        if processInfo.isUITesting {
            let keys = processInfo[.assemblyKeys] ?? ""
            assembler.apply(assembly: TestAssembly(keys: keys))
        }
    }

    #if Debug
    public func apply(_ assembly: Assembly) {
        assembler.apply(assembly: assembly)
    }
    #endif
}

生产和测试组件具有相同的结构,我只更改创建的实例

class ProductionAssembly: Assembly {

    func assemble(container: Container) {
        registerPaymentRequests(container)
    }
    private func registerPaymentRequests(_ container: Container) {
        container.register(PaymentApiClientProtocol.self) { _ in
            PaymentsApiClient()
        }
    }
}

有时我想在操作发生后从 DI 更改返回的实例。所以我尝试应用一个新的程序集来更改注册的实例,但它总是返回以前的实例PaymentsApiClient而不是TestingPaymentsApiClient

DIAssembler.shared.apply(FromUITestAssembly())

class FromUITestAssembly: Assembly {
    func assemble(container: Container) {
        container.register(PaymentApiClientProtocol.self) { _ in
            return TestingPaymentsApiClient()
        }
    }
}
4

0 回答 0