Swift单元测试:对象类的模块名称导致类型检查失败

时间:2019-04-19 17:59:15

标签: ios swift unit-testing

我已经在项目中进行了单元测试几个星期,并且到目前为止,它们一直在正常工作。

我的一个新单元测试实例化了一个自定义视图控制器。所述视图控制器实例化并添加了CoolSearchBar类型的子视图,这是我自己创建的类(.swift文件和.xib文件)。

在上述视图控制器中,我以编程方式加载了CoolSearchBar实例,然后将其添加到视图层次结构中,如下所示:

guard let searchBar = Bundle.main.loadNibNamed(String(describing: CoolSearchBar.self), owner: nil, options: nil)?.first as? CoolSearchBar else {
    fatalError("Search bar could not be loaded from nib")
}

当我正常运行该应用程序时,此检查通过,其余代码继续执行。

但是,当我运行单元测试时,上面代码中的致命错误被击中。我进行了一些挖掘,发现导致错误的原因是仅类名(CoolSearchBar)并不能说明全部问题。

具体来说,我使用NSStringFromClass得到了我正在比较的对象的类的更详细的描述。基本上,正在创建的xib将评估为类类型:

MyApp.CoolSearchBar

但是正在测试的类(as? CoolSearchBar部分)的评估结果为:

MyAppTests.CoolSearchBar

有人知道为什么模块名称在类上有所不同吗?我如何才能获得这两个看似相同的类来对同一事物进行求值,以便我的单元测试能够再次通过?

谢谢,如果您需要更多信息,请发表评论。

1 个答案:

答案 0 :(得分:1)

您可能也将CoolSearchBar添加到了测试目标。从CoolSearchBar的目标成员资格中取消选中测试。 如果要从测试项目上的主应用程序访问类,请通过添加以下内容将其导入:

@testable import myApp

enter image description here

注意:

正如Brian Sachetta所注意到的那样。从目标成员资格中删除某个类之后,所有使用该类的其他人都将开始抱怨。因此,必须将主项目中添加到测试目标成员资格的所有类从该成员资格中删除。