Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios XCEST测试用例无法访问导航控制器_Ios_Unit Testing_Singleton - Fatal编程技术网

Ios XCEST测试用例无法访问导航控制器

Ios XCEST测试用例无法访问导航控制器,ios,unit-testing,singleton,Ios,Unit Testing,Singleton,我正在应用程序测试模式下运行单元测试,以便在XCode中进行UI自动化测试。我的应用程序将其导航控制器加载并设置为单例,每当主应用程序调用[navigationManager sharedInstance]时,它都会返回单例。然而,在我的XCTest中,当我尝试访问[navigationManager sharedInstance]时,它返回nil。有人知道为什么会发生这种情况吗?解决方案是:在编写单元测试时不使用sharedInstance 在navigationManager类中,您有一个i

我正在应用程序测试模式下运行单元测试,以便在XCode中进行UI自动化测试。我的应用程序将其导航控制器加载并设置为单例,每当主应用程序调用[navigationManager sharedInstance]时,它都会返回单例。然而,在我的XCTest中,当我尝试访问[navigationManager sharedInstance]时,它返回nil。有人知道为什么会发生这种情况吗?

解决方案是:在编写单元测试时不使用sharedInstance

navigationManager
类中,您有一个
init
方法,因此在
单元测试中,使用init创建一个实例,并使用该实例进行测试

共享实例在测试中不好,这就是原因,因为最好使用依赖项注入,所以初始化一个对象并将其传递给您希望使用它的每个其他对象

例如,我在
AppDelegate
中初始化我的
DataManager
,然后将
DataManager
传递给我的
rootViewController
。如果我打开另一个控制器,我会将
dataManager
传递给它,以此类推。
这也是要测试的最佳架构,因为在测试中,您还可以创建一个
DataManager
MOCK
,并使用它将其传递给
viewController
并测试其他内容。

这是每个使用导航控制器的应用程序始终创建的单例。这就是导航控制器。这是苹果建立iOS的一部分。我不能不使用它,或者我会使用它。我只是解释一下,如果你不相信我,在谷歌上搜索,你会发现我上面说的话。您也可以使用它,但您不必使用sharedInstance,而必须使用init访问。您是否在init中使用
dispatch\u once
?这是共享实例测试中的一个问题,例如,它是一个苹果单例。我看不到源代码。然而,我确实解决了这个问题。如果在构建目标中导入singleton类,它将在启动应用程序和运行测试之间重置它们。