2015-08-28 190 views
17

我最近已将我的应用程序和单元测试转换为Swift 2.0。我在我的Tests.swift文件中使用了@testable import AppName单元测试Swift 2.0,@testable导入和方案定位问题

由于与不能够在多个目标(see here for the issue)来执行子类的问题,我EntityName类只能是目标会员AppName,而不是AppNameTests

的问题是,一旦我切换到AppNameTests架构的模块中运行单元测试,代码AppName找不到类EntityName,我得到

使用未声明的类型“实体名称”

如果在AppNameTests方案中运行测试而没有实体类不是该方案的成员时,如何编译AppName

回答

17

由于与不能够在多个目标

当编译相同斯威夫特代码的不同目标部分执行子类的问题时,编译器实际上产生不同类别。所以它的行为如同设计,但在运行应用程序的单元测试时几乎肯定不是你想要的。

有两种方法,我建议您设置模式,让测试:

1.公共模式(推荐)

在你的应用目标:

import RealmSwift 
public class MyModel: Object {} 

此代码应该只有被编译为应用程序目标的一部分,并且您的单元测试可以按以下方式设置:

import MyApp 
// should be able to access `MyModel` 

够简单吗?

2. @Testable(SWIFT 2只)

这种方法依赖于@testable关键字夫特2.

引入。在你的应用程序的目标:

import RealmSwift 
internal class MyModel: Object {} // ACL cannot be `private` 

再次,此代码应只有被编译为您的应用程序目标的一部分,并且您的单元测试可以按以下方式设置:

@testable import MyApp 
// should be able to access `MyModel` 

确保MyApp的内部版本设置Enable Testability设置为YES

如果您正在构建一个框架,而该框架的用户无法访问某些内部模型,则此方法可能优于公共模型。

领域都有自己的文档,详细说明这些常见的方法来测试,你可以在这里阅读专用部分:https://realm.io/docs/swift/latest/#avoid-linking-realm-and-tested-code-in-test-targets

+0

正确的,我*可*使用@testable,但文件的访问我的模型从内MyApp的可以在编译MyAppTests如果不是从我的测试访问为MyModel!非常令人沮丧 – styler1972

+0

听起来像你的项目配置有问题。如果我不得不猜测,我会说模型文件正在与单元测试目标进行编译,但不是应用程序目标。如果您将项目发送到[email protected],我很乐意查看它。 – jpsim

+0

嘿,事实证明,我不得不停止针对我的整个MyApp模块的测试..坚果,它不工作! – styler1972

8

我不得不停止针对我的整个应用.swift文件是有MyAppTests的成员,并且单靠在@testable import MyApp

+0

这正是它应该如何工作。只编译一次! – jpsim

+2

注意'MyApp'必须是项目中的* product module name *(设置 - >目标 - >生成设置 - >产品模块名称) –

0

我也有这个错误最近并没有任何上述步骤解决了问题,什么也解决它被移除从编译来源非SWIFT文件建立阶段的目标要运行的测试。这是失败默默

enter image description here

0

首先确保@testable import MyApp被包含在每个测试文件。然后,在您的测试目标构建阶段中,删除所有非测试文件的复制包资源部分。测试目标中指向不在测试目标中的应用程序文件的应用程序文件正在破坏您的单元测试。删除测试目标中的所有应用程序文件并添加@testable标志,并且所有内容都应该可以正常工作!

0

我有类似的问题,问题是所有的应用程序源文件都链接到单元测试目标,所以编译了两次!

另外,我通过迦太基安装了Realm,并且必须包括框架“Realm.framework”和“RealmSwift.framework”的两个目标(主要和测试),因为否则它将无法工作。

这里是问题的链接

https://github.com/realm/realm-cocoa/issues/3627