gpt4 book ai didi

ios - 将扩展添加到外部依赖项时中止陷阱 6

转载 作者:行者123 更新时间:2023-11-30 11:25:24 24 4
gpt4 key购买 nike

我正在尝试向依赖项添加扩展以进行测试。依赖项是一个标记为 Final 的类,我想制作一个模仿该接口(interface)的协议(protocol),以便我可以在测试中将真实的实现替换为模拟对象。如果该扩展包含在我的项目中,我目前在构建测试时遇到中止陷阱 6 错误。如果没有扩展,项目的构建不会出现错误,但我无法将我的依赖项作为协议(protocol)传递,这阻止我在测试中将其交换为模拟对象。因为该类被标记为 Final,所以我无法对该对象进行子类化以将我的协议(protocol)添加到其中。

我添加了 3 个对象来允许此行为:

RealmProtocol.swift:这是一个模仿 Realm 对象公共(public)接口(interface)的协议(protocol)(我的外部依赖项,但这并非特定于 Realm)。

import RealmSwift

protocol RealmProtocol {
func add(_ object: Object, update: Bool)
func beginWrite()
func commitWrite(withoutNotifying tokens: [NotificationToken]) throws
func object<Element: Object, KeyType>(ofType type: Element.Type, forPrimaryKey key: KeyType) -> Element?
func objects<Element: Object>(_ type: Element.Type) -> Results<Element>
}

MockRealm.swift:这是我的 Realm.swift 模拟对象。在生产中,将使用 Realm 对象,在我的测试中,它将与 MockRealm 交换,以便我可以验证是否在正确的时间调用了正确的方法。

import Foundation
import RealmSwift

@testable import RealmObjectMocking

class MockRealm: RealmProtocol {
var addCalled = false
var beginWriteCalled = false
var commitWriteCalled = false
var objectCalled = false
var objectsCalled = false

var objectReturn: Any?

func add(_ object: Object, update: Bool) {
addCalled = true
}

func beginWrite() {
beginWriteCalled = true
}

func commitWrite(withoutNotifying tokens: [NotificationToken]) throws {
commitWriteCalled = true
}

func object<Element: Object, KeyType>(ofType type: Element.Type, forPrimaryKey key: KeyType) -> Element? {
objectCalled = true
let object = objectReturn as? Element
return object
}

func objects<Element: Object>(_ type: Element.Type) -> Results<Element> {
objectsCalled = true
let realm = try! Realm()
return realm.objects(type)
}
}

Realm.swift:这是 Realm 对象的扩展,使其符合我的协议(protocol)。如果项目中没有此文件,则构建不会出现错误。包含此内容后,我得到了中止陷阱 6。该实现是空的,因为我的协议(protocol)与 Realm 对象上的现有公共(public)方法相匹配。

import RealmSwift

extension Realm: RealmProtocol {}

我不确定这是否是扩展标记为final的类的问题,或者我是否在这里遇到了某种循环依赖,或者可能是另一个问题。许多帖子建议关闭优化来解决此错误,但这并没有帮助。此外,当项目中包含类扩展时打开 MockRealm.swift 文件会导致编辑器崩溃。因此,我还针对此问题提交了 Radar。

这里是显示该问题的示例项目的链接。示例应用程序中的代码与上面的代码相同: https://github.com/skladek/RealmObjectMocking

最佳答案

这似乎是 Xcode 错误,而不是实现问题。一位苹果开发人员告诉我,这个问题在 Xcode10-Beta 1 中已修复。我已经测试并确认了。由于我的产品将在 Xcode 10 和 iOS 12 发布后发布,因此我对保持原样感到满意。

关于ios - 将扩展添加到外部依赖项时中止陷阱 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50789394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com