单元测试Swift 2.0,@ stestable导入和方案定位问题

时间:2015-08-28 14:55:09

标签: ios swift unit-testing swift2 realm

我最近转换了我的应用程序,并将单元测试转换为Swift 2.0。我在Tests.swift文件中使用@testable import AppName

由于无法在多个目标(see here for the issue)中执行子类的问题,我的班级EntityName只能是目标成员资格AppName,而不是AppNameTests }。

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

  

使用未声明的类型'EntityName'

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

5 个答案:

答案 0 :(得分:20)

  

由于无法在多个目标中执行子类的问题

当编译相同的Swift代码作为不同目标的一部分时,编译器实际上生成不同的类。所以这个设计符合设计,但在运行应用程序的单元测试时几乎肯定不是你想要的。

我建议您通过两种方式设置模型以进行测试:

1。公共模型(推荐)

在您的应用目标中:

import RealmSwift
public class MyModel: Object {}

此代码应仅 作为应用程序目标的一部分进行编译,并且可以通过以下方式设置单元测试:

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

够简单吗?

2。 @Testable(仅限Swift 2)

这种方法依赖于Swift 2中引入的@testable关键字。

在您的应用目标中:

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

同样,此代码应仅 作为应用程序目标的一部分进行编译,并且可以按以下方式设置单元测试:

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

确保MyApp的构建设置Enable Testability设置为YES

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

Realm有一个专门的文档部分,详细介绍了这些常见的测试方法,您可以在这里阅读:https://realm.io/docs/swift/latest/#avoid-linking-realm-and-tested-code-in-test-targets

答案 1 :(得分:9)

我不得不停止将我的整个应用.swift文件定位为拥有MyAppTests的会员资格,并完全依赖于@testable import MyApp

答案 2 :(得分:0)

我最近也遇到了这个错误,上面没有一个步骤解决了这个问题,修复它的是从你想要运行测试的目标中的编译源构建阶段中删除非swift文件上。这是默默失败

enter image description here

答案 3 :(得分:0)

首先确保每个测试文件中都包含@testable import MyApp。然后,在Test Target Build Phases中,删除Copy Bundle Resources部分的所有非测试文件。测试目标中指向不在测试目标中的应用程序文件的应用程序文件会破坏您的单元测试。从测试目标中删除所有应用程序文件并添加@testable标志,一切都应该有效!

答案 4 :(得分:0)

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

此外,我通过Carthage安装了Realm,并且必须包含框架的目标(主要和测试)" Realm.framework"和#34; RealmSwift.framework"因为它不会起作用。

以下是问题链接

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