【问题标题】:Unit testing Swift 2.0, @testable import, and scheme targeting issues单元测试 Swift 2.0、@testable 导入和方案定位问题
【发布时间】:2015-08-28 14:55:09
【问题描述】:

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

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

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

使用未声明的类型“EntityName”

当从AppNameTests 方案运行测试时,如果该实体类不是方案的成员,我如何让AppName 编译?

【问题讨论】:

    标签: ios swift unit-testing swift2 realm


    【解决方案1】:

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

    当编译相同的 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

    【讨论】:

    • 对,我可以使用 @testable 从我的测试中访问 MyModel,但是在编译 MyAppTests 时无法从 MyApp 中访问我的模型的文件!很郁闷
    • 听起来您的项目配置有问题。如果我不得不猜测,我会说模型文件是使用单元测试目标而不是应用目标编译的。如果您将您的项目发送至 help@realm.io,我会很乐意进行调查。
    • 嘿,原来我不得不停止针对我的整个 MyApp 模块的测试.. 坚果,它不起作用!
    • 另外,要使 @testable 导入工作,测试目标必须是“单元测试包”(不是 UI 测试包)。
    • 如果我只想导入一个 viper 文件夹进行单元测试,那么在包含整个应用程序的 @testable import myApp 上的构建性能如何?我不喜欢在 xcode 上等待 kiwi 测试
    【解决方案2】:

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

    【讨论】:

    • 这正是它应该如何工作的。只编译一次!
    • 注意MyApp必须是你项目中的产品模块名称(设置->目标->构建设置->产品模块名称)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        这里是问题链接

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

        【讨论】:

          猜你喜欢
          • 2018-08-31
          • 2015-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多