• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在单元测试中模拟 UserDefaults 对象返回 _ArrayBuffer

[复制链接]
菜鸟教程小白 发表于 2022-12-11 18:25:39 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我试图在我的单元测试中删除对操作系统对象(如 URLSessions 和 UserDefaults)的依赖关系。我一直试图将预缓存的数据模拟到我为测试目的而制作的模拟 UserDefaults 对象中。

我创建了一个具有编码和解码功能的测试类,并将模拟数据存储在一个成员变量中,该成员变量是一个 [String: AnyObject] 字典。在我的应用中,启动时它会检查缓存中的数据,如果找到,则会跳过网络调用。

我所能得到的只是 nil 或这个持续错误:

fatal error: NSArray element failed to match the Swift Array Element type

查看调试器,解码器应该返回一个自定义类型“问题”的数组。相反,我得到一个 _ArrayBuffer 对象。

奇怪的是,如果我的应用程序将数据加载到我的模拟 userdefaults 对象中,它可以正常工作,但是当我将对象硬编码到其中时,我会收到此错误。

这是我模拟 UserDefaults 对象的代码:

class MockUserSettings: DataArchive {
    private var archive: [String: AnyObject] = [:]

    func decode<T>(key: String, returnClass: T.Type, callback: (([T]?) -> Void)) {
        print("attempting payload from mockusersettings with key: \(key)")
        if let data = archive[key] {
            callback(data as! [T])
        } else {
            print("Found nothing for: \(key)")
            callback(nil)
        }
    }

    public func encode<T>(key: String, payload: [T]) {
        print("Adding payload to mockusersettings with key: \(key)")
        archive[key] = payload as AnyObject
    }
}

以及我想要通过的测试:

func testInitStorageWithCachedQuestions() {
    let expect = XCTestExpectation(description: "After init with cached questions, initStorage() should return a cached question.")

    let mockUserSettings = MockUserSettings()
    var questionsArray: [Question] = []
    for mockQuestion in mockResponse {
        if let question = Question(fromDict: mockQuestion) {
            questionsArray.append(question)
        }
    }
    mockUserSettings.encode(key: "questions", payload: questionsArray)
    mockUserSettings.encode(key: "currentIndex", payload: [0])
    mockUserSettings.encode(key: "nextFetchDate", payload: [Date.init().addingTimeInterval(+60)])

    let questionStore = QuestionStore(dateGenerator: Date.init, userSettings: mockUserSettings)

    questionStore.initStore() { (question) in
        let mockQuestionOne = Question(fromDict: self.mockResponse[0])
        XCTAssertTrue(question == mockQuestionOne)
        XCTAssert(self.numberOfNetworkCalls == 0)
        expect.fulfill()
    }
    wait(for: [expect], timeout: 1.0)
}

如果有人可以帮助我弄清楚我做错了什么,我将不胜感激。我是否正确存储了我的模拟对象?这个 ArrayBuffer 和 ArrayBridgeStorage 是什么东西??



Best Answer-推荐答案


我解决了我的问题。我的自定义类同时针对我的应用程序和测试。在单元测试中,我使用的是测试目标版本的类构造函数,而不是主应用程序的版本。

因此,要从中吸取的教训就是使用 @testable import 而不是让您的应用类以测试为目标。

关于ios - 在单元测试中模拟 UserDefaults 对象返回 _ArrayBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45451374/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap