【问题标题】:How to test internals of an Objective-C framework with Swift如何使用 Swift 测试 Objective-C 框架的内部结构
【发布时间】:2015-09-08 03:31:39
【问题描述】:

我有一个用 Objective-C 编写的框架/模块,并想在 Swift 中测试它的外部接口内部。为此,我在同一个项目中创建了一个新的测试目标,以框架为目标。在 Swift 代码中,我可以毫无问题地导入模块并使用公共类。但是,我无法访问测试中的内部类。

我尝试了以下方法:

  • 我将内部资源的可见性设置为“项目”。据我了解,这应该使它们可用于同一项目中的代码。但是,它不起作用。还是我需要以不同的方式导入它们?
  • 我还在 Xcode 7 中尝试了 Swift 2 的新 @testable import 功能,但这似乎对 Objective-C 框架不起作用。

我想出的是在测试目标的桥接头中手动导入我想要测试的所有私有源。这样可行。但是,这并不是用 Swift 测试 Objective-C 框架的预期方式。

关于如何更好地做到这一点的任何想法?

【问题讨论】:

  • Frank - 通过将它们的标题的导入语句添加到测试项目的桥接头中,我可以看到内部结构。这是你在做什么?我的主要问题比你的更深奥一点。只要它们没有参数,我就可以看到任何内部方法。你见过类似的吗?
  • 嗯,这很奇怪。是的,我只是将它们导入到测试目标的桥接头中,不,我还没有遇到过这样的问题。你在使用可变参数列表吗?因为 Swift 不能转换这些方法。此外,有时 Xcode 中的自动完成功能不起作用,但代码仍然可以编译。你试过吗?
  • 据我了解桥接头,这是将私有标头公开给swift的方法,而公共标头通过框架的伞头公开。

标签: objective-c swift testing module frameworks


【解决方案1】:

我过去处理此类问题的方式是在框架内创建公共类,将要测试的内部类子类化。您可以添加编译器标志以使它们仅使用调试或测试配置构建。

例如,如果您有一个名为SomeClass 的类,您将拥有SomeClassTest,它将公开覆盖所有方法。这样做还可以让您轻松地包含测试逻辑,例如在需要的地方插入虚拟数据等。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。

    我通过将 Objective C 扩展定义为仅添加我想要测试的方法的定义的测试助手来解决这个问题。然后我将扩展头添加到桥接头中。

    例如:

        #import "ClassIWantToTest.h"
        @interface ClassIWantToTest (Internals)
    
            - (BOOL)privateMethodToTest;
    
        @end
    

    在桥接头中:

    //
    //  Use this file to import your target's public headers that you would like to expose to Swift.
    //
    #import "ClassIWantToTest.h"
    #import "ClassIWantToTest+Internals.h"
    

    不如@testable,但比子类化更少侵入性,并且可以在您的测试目标中定义扩展,因此您无需担心摆弄编译器标志。

    【讨论】:

      猜你喜欢
      • 2019-04-09
      • 2015-05-03
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多