我尝试从 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()
}
}
}