Rei*_*ner 1 arrays unit-testing core-data ios swift
我的应用程序使用 CoreData。其中一个实体是
\nfinal class ViewItem: NSManagedObject {\n// \xe2\x80\xa6\n} \nRun Code Online (Sandbox Code Playgroud)\n在单元测试期间,我尝试执行以下获取请求:
\nlet viewItemFetchRequest = NSFetchRequest<ViewItem>(entityName: "ViewItem") \nRun Code Online (Sandbox Code Playgroud)\n作为
\nviewContext.performAndWait {\n do {\n let fetchedViewItems = try viewContext.fetch(viewItemsFetchRequest)\n let viewItems = Set(fetchedViewItems)\n // \xe2\x80\xa6\n } \nRun Code Online (Sandbox Code Playgroud)\n尽管代码在正常操作期间正确执行,但在单元测试期间它会崩溃。
\n当我在指令后面设置断点时try,就会到达该断点,即取指不会抛出。\n但是,当我想通过或 with
访问 时,出现致命错误fetchedViewItemsSet(fetchedViewItems)
(lldb) po fetchedViewItems\nFatal error: NSArray element failed to match the Swift Array Element type\nExpected ViewItem but found ViewItem\n2022-06-07 10:31:30.245019+0200 ShopEasy[42069:1864673] Fatal error: NSArray element failed to match the Swift Array Element type\nExpected ViewItem but found ViewItem\n1 value \nRun Code Online (Sandbox Code Playgroud)\n\n可能是什么原因以及如何解决该问题?
\nPS:我发现了一些与此错误相关的帖子,这个,这个和这个,但没有一个被报告Expected <some type> but found <some type>。
编辑:
\n为了调查情况,我将代码修改如下:
\nviewContext.performAndWait {\n do {\n let fetchedViewItems: [ViewItem] = try viewContext.fetch(viewItemsFetchRequest)\n let fetchedObjects: [AnyObject] = try viewContext.fetch(viewItemsFetchRequest)\n let viewItems = Set(fetchedViewItems)\n // \xe2\x80\xa6\n } \nRun Code Online (Sandbox Code Playgroud)\nlet viewItems = Set(fetchedViewItems)并在崩溃的指令处设置断点。
\n这是到达断点时的情况:
在调试区域的变量视图中打印fetchedObjects的描述给出
\nPrinting description of fetchedObjects:\n\xe2\x96\xbf 1 element\n \xe2\x96\xbf 0 : <ShopEasy.ViewItem: 0x10b3147c0> (entity: ViewItem; id: 0x10b822540 <x-coredata:///ViewItem/t51E2E772-5F7C-43E4-BBC6-68DC139F1BE02>; data: {\n fixedAtTopAt = nil;\n\xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n并在控制台中
\n(lldb) po fetchedObjects\n\xe2\x96\xbf 1 element\n \xe2\x96\xbf 0 : <ShopEasy.ViewItem: 0x10b3147c0> (entity: ViewItem; id: 0x10b822540 <x-coredata:///ViewItem/t51E2E772-5F7C-43E4-BBC6-68DC139F1BE02>; data: {\n fixedAtTopAt = nil;\n\xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n但是,在调试区域的变量视图中打印fetchedViewItems的描述会给出
\nPrinting description of fetchedViewItems:\n([ShopEasyTests.ViewItem]) fetchedViewItems = 1 value {\n [0] = 0x000000010b3147c0\n}\nRun Code Online (Sandbox Code Playgroud)\n但在控制台中
\n(lldb) po fetchedViewItems\nFatal error: NSArray element failed to match the Swift Array Element type\nExpected ViewItem but found ViewItem\n2022-06-08 08:54:02.359228+0200 ShopEasy[51124:2241262] Fatal error: NSArray element failed to match the Swift Array Element type\nExpected ViewItem but found ViewItem\n1 value\nRun Code Online (Sandbox Code Playgroud)\n这似乎是应用程序命名空间 (ShopEasy.ViewItem) 和单元测试命名空间 (ShopEasyTests.ViewItem) 之间的一些冲突。
\n我可以在示例项目中重现您的错误,其中托管对象类定义文件已添加到应用程序目标和单元测试目标。当运行有关在两个地方实现的类的测试时,这也会发出一些控制台警告。
您的情况是这样吗?
该代码应该仅出现在您的应用程序目标中,并且您应该用于@testable import ShopEasy在单元测试中访问应用程序代码。