如何在 XCTestCase 中使用模块中的类?

max*_*max 3 tdd xcode swift

我正在尝试测试这个类 ( Swiftris/Swifteris/Array2D.swift):

class Array2D<T> {

    let rows: Int
    let columns: Int

    var array: Array<T?>

    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns

        array = Array<T?>(count:rows * columns, repeatedValue: nil)
    }

    subscript(column: Int, row: Int) -> T? {
        get {
            return array[(row * columns) + column]
        }
        set {
            array[(row * columns) + column] = newValue
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这个简单的测试 ( Swiftris/SwiftrisTests/Array2DTest.swift):

import UIKit
import XCTest

class Array2DTest: XCTestCase {

    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }

    func testHasRows() {
        var array: Array2D = Array2D(rows: 10, columns: 15)
        XCTAssertEqual(array.rows, 20, "an Array2D instance should have the correct number of rows")
    }
}
Run Code Online (Sandbox Code Playgroud)

它莫名其妙地无法解析 Array2D:

Swifteris/SwifterisTests/Array2DTest.swift:12:20: Use of undeclared type 'Array2D' 
Run Code Online (Sandbox Code Playgroud)

我需要将自己的模块导入到我的测试中吗?这非常令人费解,因为我在另一个项目中做了完全相同的瘦身,并且在解析被测类时没有遇到任何问题。

rin*_*aro 6

您有 2 个选择。

添加Array2D.swiftSwifterisTests目标会员

这很简单

截屏

导入SwifterisArray2DTest.swift

基本上推荐这个方法,但是比较烦人。

首先,您必须将所有可测试的类/方法/属性声明为public

Array2D.swift:

public class Array2D<T> {

    public let rows: Int
    public let columns: Int

    private var array: Array<T?>

    public init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns

        array = Array<T?>(count:rows * columns, repeatedValue: nil)
    }

    public subscript(column: Int, row: Int) -> T? {
        get {
            return array[(row * columns) + column]
        }
        set {
            array[(row * columns) + column] = newValue
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,导入主模块Swifteris到测试模块SwifterisTests

import XCTest
import Swifteris

// Here Array2D is avaiable.
Run Code Online (Sandbox Code Playgroud)

关于此问答的更多讨论:Swift、访问修饰符和单元测试