Swift 如何在带有Xcode 7 UITests的viewcontroller中使用模拟MOC?

Swift 如何在带有Xcode 7 UITests的viewcontroller中使用模拟MOC?,swift,core-data,xctest,moc,uitest,Swift,Core Data,Xctest,Moc,Uitest,因此,我发现在编写XCTests或UI测试时,我无法访问我的应用程序代理的MOC。我遇到了一个错误,上面写着“我是我的应用程序,无法访问我的应用程序。” 很酷,没问题,我编写了所有代码来接受任何MOC,然后在setup()中制作了一个模拟MOC,这样每个XTest都有一个新的石板,不会触及我的实际数据。将我的应用程序作为可测试导入。砰的一声,一切正常,我不必改变目标,也不必在我的对象中编写任何代码来“强制它为测试工作!” 问题是我不知道如何在UI测试和故事板中做到这一点。大多数视图控制器从vie

因此,我发现在编写XCTests或UI测试时,我无法访问我的应用程序代理的MOC。我遇到了一个错误,上面写着“我是我的应用程序,无法访问我的应用程序。”

很酷,没问题,我编写了所有代码来接受任何MOC,然后在setup()中制作了一个模拟MOC,这样每个XTest都有一个新的石板,不会触及我的实际数据。将我的应用程序作为可测试导入。砰的一声,一切正常,我不必改变目标,也不必在我的对象中编写任何代码来“强制它为测试工作!”

问题是我不知道如何在UI测试和故事板中做到这一点。大多数视图控制器从viewdidload中的appdelegate获取MOC。我不知道如何告诉它使用模拟moc,以便每个测试都可以干净地开始,这样它就不会使用我的实际核心数据存储,但在不测试时也能够正常工作。这里的目标是让主应用程序代码在知道它正在测试的情况下没有任何引用

必须有一个干净的方法来做到这一点,而不会变得丑陋,改变目标,等等。除了UI,这将像我的XCTests一样工作。我发现了这个:,但没有人回答。这个用户问了一个类似的问题,但我认为方法是错误的(清空核心数据而不是使用模拟MOC)

想法

不管它值多少钱,我正在构建一个Mac应用程序

问题是我不知道如何在UI测试和 故事板。大多数视图控制器都从appdelegate获取MOC 在viewdidload中

您永远不应该使用应用程序委托来出售核心数据堆栈的众多原因之一

在不深入了解您应该做什么的所有细节的情况下,有一点很清楚:您应该为视图控制器提供一个MOC

一种简单的方法(尽管也有一些缺点)是为视图控制器提供MOC属性

@property (strong) NSManagedObjectContext *managedObjectContext;
然后,应该在初始化视图控制器时设置此属性

一种“快速但肮脏”的方法是添加te属性,然后在
viewDidLoad
中执行类似的操作

if (!self.managedObjectContext) {
    self.managedObjectContext = appDelegate.managedObjectContext;
}
这不是这样做的建议。您应该完全从应用程序委托中删除核心数据堆栈,并将其像任何模型一样传递给视图控制器

然而,它将允许您的应用程序保持现在的工作状态,并且还将为您提供一种在UI测试中实例化视图控制器的方法,并为它们提供一个“模拟”MOC


另外,如果您没有这样做,一般来说,您应该使用内存中的持久存储来进行测试。

我目前只有一个视图控制器,因此不需要中间实现。我的问题是,使用UITest功能和故事板,如何为视图控制器提供MOC?在prepare for segue方法中很容易做到这一点,但由于测试在应用程序之外,我不确定在测试时如何在第一次启动时为其提供模拟MOC。UITests似乎并没有实例化视图控制器,而是单击屏幕上的按钮。