Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在Swift单元测试中调用方法_Objective C_Swift_Unit Testing_Objective C Category - Fatal编程技术网

Objective c 在Swift单元测试中调用方法

Objective c 在Swift单元测试中调用方法,objective-c,swift,unit-testing,objective-c-category,Objective C,Swift,Unit Testing,Objective C Category,我以前使用Objective-C进行单元测试的方法如下: 调用公共方法:没问题 调用私有方法:在单元测试文件中创建该类的类别,并将私有方法的签名放入该类别中 目前,我有以下几点: 用ObjC开发的类 Swift制定的协议 该类的单元测试是在Swift中开发的 该类(直接在其公共接口(.h)中)符合该协议。我在单元测试中有一个类实例,但不知何故,我无法在该实例上调用协议中声明的方法 现在,旧的类别解决方案不适用于扩展。当我在扩展中加入一些方法签名时,我得到一个错误,即“声明中需要函数体”

我以前使用Objective-C进行单元测试的方法如下:

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

  • 用ObjC开发的类
  • Swift制定的协议
  • 该类的单元测试是在Swift中开发的
该类(直接在其公共接口(.h)中)符合该协议。我在单元测试中有一个类实例,但不知何故,我无法在该实例上调用协议中声明的方法

现在,旧的类别解决方案不适用于扩展。当我在扩展中加入一些方法签名时,我得到一个错误,即“声明中需要函数体”

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


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

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

Xcode为此问题提供了两部分解决方案:

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

下面也是一个示例(针对MySwiftApp)

  • 为启用可测试性设置为“是”的目标生成的类

  • 单元测试类

    // 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仅为内部功能提供访问权限; 文件专用和专用声明在其外部不可见 使用@testable时的常用范围


您是否尝试在Swift测试类中使用
@testable import
导入模块?它应该做你想做的事情,也就是“打开”对测试类私有内容的访问,而不强迫你改变可见性。这是:“在测试源代码中使用@testable import{ModuleName},使所有公共和内部例程可供XCTest目标使用,但不可供其他框架和应用程序目标使用。”@testable仅使受保护的成员可用于测试,私有方法、函数和参数仍然不可用。这不起作用。
// 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()
    }
}