【问题标题】:Calling a Method in Swift Unit Tests在 Swift 单元测试中调用方法
【发布时间】:2016-02-22 11:22:16
【问题描述】:

我之前在 Objective-C 中进行单元测试的方法如下:

  • 调用公共方法:没问题
  • 调用私有方法:在您的单元测试文件中创建该类的类别,并将私有方法的签名放入该类别中

目前,我有以下内容:

  • 在 ObjC 中开发的类
  • 用 Swift 开发的协议
  • 用 Swift 开发的该类的单元测试

该类(直接在其公共接口 (.h) 中)符合该协议。我的单元测试中有一个类实例,但不知何故,我无法通过该实例调用协议中声明的方法。

现在,旧的类别解决方案不适用于扩展。当我在扩展中添加一些方法签名时,我收到“声明中期望函数体”的错误消息。

如何以最佳方式使用 Swift 调用函数?

PS:我不想在类的公共接口中再次声明该方法,这是一个丑陋的解决方案。

【问题讨论】:

  • 您是否尝试在 Swift 测试类中使用 @testable import <Module> 导入模块?它应该完全按照您的意愿行事,即“开放”对测试类的私有内容的访问,而不强制您更改可见性。这是what they say“在您的测试源代码中使用@testable import {ModuleName},使所有公共和内部例程可由XCTest 目标使用,但不能由其他框架和应用程序目标使用。”跨度>
  • 记住; @testable 仅使受保护的成员可用于测试,私有方法、函数和参数仍然不可用。
  • 这行不通,伙计们。

标签: objective-c swift unit-testing objective-c-category


【解决方案1】:

根据“使用 Swift 编写测试”here 的文档:

Xcode 为这个问题提供了一个两部分的解决方案:

当您将启用可测试性构建设置设置为是时,即 新项目中的测试版本默认为 true,Xcode 包括 -enable-testing 编译期间的标志。这使得编译模块中声明的 Swift 实体有资格获得更高级别的访问。 当您将@testable 属性添加到导入语句中时 启用测试编译的模块,您激活提升的访问权限 对于该范围内的该模块。类和类成员标记为 internal 或 public 的行为就像它们被标记为打开一样。其他实体 标记为内部行为,就好像它们被宣布为公共一样。

这也是例子(MySwiftApp)

  • Enable Testability 设置为 yes

    的目标构建的类
    import Cocoa
    @NSApplicationMain
    
    class AppDelegate: NSObject, NSApplicationDelegate {
        @IBOutlet weak var window: NSWindow!
        func foo() {
    
        println("Hello, World!")
        }
    }
    
  • 单元测试类

    // Importing XCTest because of XCTestCase
    import XCTest
    
    // Importing AppKit because of NSApplication
    import AppKit
    
    // Importing MySwiftApp because of AppDelegate
    @testable import MySwiftApp
    
    class MySwiftAppTests: XCTestCase {
        func testExample() {
            let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate
            appDelegate.foo()
        }
    }
    

另见重要说明

注意:@testable 仅提供对内部函数的访问; file-private 和 private 声明在它们之外不可见 使用@testable 时的常用范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多