【问题标题】:How do I use mock MOC in my viewcontroller with Xcode 7 UITests?如何在带有 Xcode 7 UITests 的视图控制器中使用模拟 MOC?
【发布时间】:2016-01-29 20:36:28
【问题描述】:

所以我发现在编写 XCTest 或 UI 测试时,我无法访问我的应用委托的 MOC。我遇到了某种错误,上面写着“我是 MyAppUITests,我无法访问 MyApp 的东西”。

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

问题是我不确定如何为 UI 测试和情节提要执行此操作。我的大多数视图控制器都从 viewdidload 中的 appdelegate 获取我的 MOC。我不知道如何告诉它使用模拟 moc,以便每个测试都可以开始干净,并且它不使用我的实际核心数据存储,但在不测试时也能够正常工作。这里的目标是让主应用程序代码知道它正在被测试时没有任何对其的引用。

必须有一种干净的方法来做到这一点,而不会变得丑陋、改变目标等。除了 UI 之外,它可以像我的 XCTests 那样工作。我找到了这个:How to start with empty Core Data for every UI Test Assertion in Swift?,但没有人回答。该用户提出了类似的问题,但我认为采用了错误的方法(清空核心数据而不是使用模拟 MOC)。

想法?

不管怎样,我正在构建一个 Mac 应用程序。

【问题讨论】:

    标签: swift core-data xctest moc uitest


    【解决方案1】:

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

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

    不用详细说明你应该做什么,有一点很清楚:你应该为你的视图控制器提供一个 MOC。

    一种简单的方法(尽管也有一些缺点)是给你的视图控制器一个 MOC 属性。

    @property (strong) NSManagedObjectContext *managedObjectContext;
    

    然后,您应该在初始化视图控制器时设置此属性。

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

    if (!self.managedObjectContext) {
        self.managedObjectContext = appDelegate.managedObjectContext;
    }
    

    不是建议这样做。您应该完全摆脱应用程序委托的核心数据堆栈,并且应该像将任何模型传递给视图控制器一样将其传递给视图控制器。

    但是,它可以让您的应用像现在一样继续工作,并且还可以为您提供一种在 UI 测试中实例化视图控制器并为它们提供“模拟”MOC 的方法。

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

    【讨论】:

    • 我目前只有一个视图控制器,所以我不需要在实现之间进行切换。我的问题是,使用 UITest 功能和故事板,我如何为视图控制器提供 MOC?在准备 segue 方法中很容易做到这一点,但由于测试在应用程序之外,我不确定如何在测试时首次启动时给它模拟 MOC。 UITests 似乎没有实例化视图控制器,它点击屏幕上的按钮。
    猜你喜欢
    • 2012-01-05
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多