我最近将我的应用程序和单元测试转换为 Swift 2.0。我在我的 Tests.swift 文件中使用 @testable import AppName
。
由于无法在多个目标中执行子类的问题 (see here for the issue),我的类 EntityName
只能是 Target Membership AppName
,而不能AppNameTests
。
问题是,一旦我切换到 AppNameTests
模式来运行单元测试,模块 AppName
中的代码就找不到类 EntityName
我得到了
Use of undeclared type 'EntityName'
当从 AppNameTests
方案运行测试时,如果实体类不是该方案的成员,我如何让 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 的build设置将 Enable Testability
设置为 YES
。
如果您正在构建一个框架,而该框架的用户不应访问某些内部模型,则此方法可能优于公共(public)模型。
Realm 在其文档中有专门的部分详细介绍了这些常见的测试方法,您可以在此处阅读:https://realm.io/docs/swift/latest/#avoid-linking-realm-and-tested-code-in-test-targets
关于ios - 单元测试 Swift 2.0、@testable 导入和方案目标问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32273954/