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

Unit testing Swift 2.0, @testable import, and scheme targeting issues

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

由于无法在多个目标 () 中执行子 classes 的问题,我的 class EntityName 只能是目标成员AppName,而不是 AppNameTests

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

Use of undeclared type 'EntityName'

当 运行ning 从 AppNameTests 方案进行测试而没有该实体 class 不是该方案的成员时,我如何让 AppName 编译?

Due to an issue with not being able to execute subclasses in multiple targets

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

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

1。 Public 型号(推荐)

在您的应用目标中:

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

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

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

我不得不停止定位我的整个应用程序。swift 文件成为 MyAppTests 的成员,并且完全依赖 @testable import MyApp

我最近也遇到了这个错误,上述 none 的步骤解决了这个问题,解决它的方法是从 编译源构建阶段删除 non-swift 文件 在您要 运行 测试的目标中。这是无声的失败

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

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

此外,我通过 Carthage 安装了 Realm,并且必须包括框架 "Realm.framework" 和 "RealmSwift.framework" 的两个目标(主要和测试),因为否则它不会工作。

这里是问题 link

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