单元测试在被测试的函数调用AppDelegate + managedObject时崩溃

5 浏览
0 Comments

单元测试在被测试的函数调用AppDelegate + managedObject时崩溃

我被以下问题困扰:\n我正在用Swift编写一个应用程序。我想对一个托管对象(称为Category)的类方法(mapCategories)进行单元测试(XCTest)。\nmyCategoryFunction接收一个NSDictionary,并将其内容映射到一个Category的列表[Category],然后返回。为了进行映射,我不得不使用以下代码创建Category对象:\n class func mapCategories(myDictionary: NSDictionary!) -> [Category]{\n var categories: [Category] = []\n /* \n ... 这里有一些代码。\n */ \n let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)\n let managedObjectContext = appDelegate.managedObjectContext\n let entityDescription = NSEntityDescription.entityForName(\"Category\", inManagedObjectContext: managedObjectContext!)\n var category = Category(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext!)\n /* \n ... 这里有一些代码。\n */ \n return Categories\n}\n\n当我运行应用程序时,代码运行正常,按预期工作。但是当我运行这个函数的单元测试时,它就会崩溃。\n首先,我遇到以下错误:\n\"AppDelegate\n这个错误发生在以下这一行:\nlet appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)\n\n当我继续执行程序时,当获取managedObjectContext时它就崩溃了,如下所示:\n\"managedObjectContext\n我试图寻找解决方案或解决方法,并尝试了以下操作:\nUIApplication.sharedApplication().delegate as AppDelegate causes EXC_BAD_ACCESS using it on swift unit test\n但是它没有起作用。有没有人有一个有效的解决方案?\n提前谢谢。

0
0 Comments

问题原因:在使用Swift2时,不需要将方法和类设置为public,可以直接使用import导入主模块。但需要注意的是,需要将Host Application属性指向主应用程序包,并在测试目标的构建设置下切换Enable Testability为Yes。

解决方法:将Host Application属性指向主应用程序包,并在测试目标的构建设置下切换Enable Testability为Yes。

文章整理如下:

使用Swift2时,我们不再需要将方法和类设置为public,可以直接使用import导入主模块。但需要注意的是,为了实现这一点,我们需要将Host Application属性指向主应用程序包,并在测试目标的构建设置下切换Enable Testability为Yes。

这样做的好处是,我们不再需要显式地将方法和类设置为public,提高了代码的简洁性和可读性。同时,我们可以更轻松地进行单元测试,因为测试目标现在可以访问主应用程序中的代码。

要实现这一点,我们需要在Xcode的构建设置中进行一些配置。首先,我们需要将Host Application属性指向主应用程序包。这可以通过在测试目标的Build Settings中找到Host Application并设置为$(BUNDLE_LOADER)来完成。

其次,我们需要在测试目标的构建设置中切换Enable Testability为Yes。这将允许测试目标访问主应用程序中的代码,以便进行单元测试。

通过这些配置,我们就可以在单元测试中使用import导入主模块,而不需要将方法和类设置为public。同时,我们也可以在测试目标中轻松地访问和测试主应用程序中的代码。

总结起来,使用Swift2时,我们可以通过将Host Application属性指向主应用程序包,并在测试目标的构建设置中切换Enable Testability为Yes,来实现不需要将方法和类设置为public的导入主模块的功能。这样可以提高代码的简洁性和可读性,并方便进行单元测试。

0
0 Comments

当测试函数调用AppDelegate + managedObject时,单元测试会崩溃。这个问题的原因是没有正确地移除AppDelegate.swift文件从你的单元测试bundle目标中。这导致你的应用程序bundle和单元测试bundle都有一个AppDelegate的定义,所以当你尝试将应用程序中的AppDelegate强制转换为单元测试bundle中的AppDelegate时,无条件的转换失败了。

为了解决这个问题,你需要右键点击AppDelegate.swift文件,选择"Show File Inspector",然后确保在"Target Membership"下只有你的应用程序旁边有一个复选框,而你的单元测试bundle旁边没有复选框。

在解决第一个问题之后,你可能会遇到与托管对象上下文相关的第二个问题。解决第一个问题也会解决第二个问题。

最后,为了使测试函数正常工作,你需要将所有要进行单元测试的方法和类设置为public。尽管这不是一个好的解决方案,但你可以在找到更好的解决方案之前先使用这个方法。

0