我的应用使用CoreData。其中一个实体是
final class ViewItem: NSManagedObject {
// …
}
在单元测试期间,我尝试执行以下获取请求:
let viewItemFetchRequest = NSFetchRequest<ViewItem>(entityName: "ViewItem")
作为
viewContext.performAndWait {
do {
let fetchedViewItems = try viewContext.fetch(viewItemsFetchRequest)
let viewItems = Set(fetchedViewItems)
// …
}
尽管代码在正常操作期间正确执行,但在单元测试期间它会崩溃。
当我在try
指令后面设置断点时,会到达此断点,即提取不会抛出。
但是,当我想通过Set(fetchedViewItems)
或使用访问fetchedViewItems
时,我得到了一个致命错误
(lldb) po fetchedViewItems
Fatal error: NSArray element failed to match the Swift Array Element type
Expected ViewItem but found ViewItem
2022-06-07 10:31:30.245019+0200 ShopEasy[42069:1864673] Fatal error: NSArray element failed to match the Swift Array Element type
Expected ViewItem but found ViewItem
1 value
下面是堆栈帧的相关部分:
原因可能是什么?我如何解决这个问题?
PS:我发现了一些与此错误相关的帖子,this,this和this one,但在这些帖子中没有一个报告Expected <some type> but found <some type>
。
- 编辑:**
为了调查这种情况,我修改了代码如下:
viewContext.performAndWait {
do {
let fetchedViewItems: [ViewItem] = try viewContext.fetch(viewItemsFetchRequest)
let fetchedObjects: [AnyObject] = try viewContext.fetch(viewItemsFetchRequest)
let viewItems = Set(fetchedViewItems)
// …
}
并在崩溃的指令let viewItems = Set(fetchedViewItems)
处设置断点。
这是到达断点时的情况:
在调试区域的变量视图中打印fetchedObjects的说明,可以得到
Printing description of fetchedObjects:
▿ 1 element
▿ 0 : <ShopEasy.ViewItem: 0x10b3147c0> (entity: ViewItem; id: 0x10b822540 <x-coredata:///ViewItem/t51E2E772-5F7C-43E4-BBC6-68DC139F1BE02>; data: {
fixedAtTopAt = nil;
…
在控制台中
(lldb) po fetchedObjects
▿ 1 element
▿ 0 : <ShopEasy.ViewItem: 0x10b3147c0> (entity: ViewItem; id: 0x10b822540 <x-coredata:///ViewItem/t51E2E772-5F7C-43E4-BBC6-68DC139F1BE02>; data: {
fixedAtTopAt = nil;
…
但是,在"调试"区域的"变量视图"中打印fetchedViewItems的说明会导致
Printing description of fetchedViewItems:
([ShopEasyTests.ViewItem]) fetchedViewItems = 1 value {
[0] = 0x000000010b3147c0
}
但在控制台中
(lldb) po fetchedViewItems
Fatal error: NSArray element failed to match the Swift Array Element type
Expected ViewItem but found ViewItem
2022-06-08 08:54:02.359228+0200 ShopEasy[51124:2241262] Fatal error: NSArray element failed to match the Swift Array Element type
Expected ViewItem but found ViewItem
1 value
这似乎是应用程序命名空间(ShopEasy.ViewItem)和单元测试命名空间(ShopEasyTests.ViewItem)之间的某种冲突。
2条答案
按热度按时间kognpnkq1#
我可以在一个示例项目中重现您的错误,其中托管对象类定义文件被添加到应用程序目标和单元测试目标。当运行关于在两个位置实现的类的测试时,这也会给出一些控制台警告。
你的情况就是这样吗?
代码应该只存在于应用目标中,并且应该使用
@testable import ShopEasy
在单元测试中访问应用代码。kwvwclae2#
我有同样的错误消息,在我的情况下,我失踪:
NSManagedObject
类定义之上的@objc(ViewItem)
。我只有:
而不是: