快速测试非标量类型

时间:2018-11-26 02:15:09

标签: swift

我想测试我的接受字符串的函数,a返回所有成对的字符作为数组s.t。

func pairsOfChars(_ s: String) -> [(Character,Character)] {
    let strArray = Array(s)
    var outputArray = [(Character,Character)]()
    for i in 0..<strArray.count - 1 {
        for j in i + 1..<strArray.count {
            outputArray.append( (strArray[i], strArray[j]) )
        }
    }
    return outputArray
}

所以我想使用XCTestCase创建一套测试。我通常使用XCTestCase和XCTAssertEqual,但是它们仅适用于C标量类型。这意味着以下测试用例将返回错误:

    class pairsTests: XCTestCase {
        func testNaive() {
            measure {
                XCTAssertEqual( pairsOfChars("abc") , [(Character("a"),Character("b")),(Character("a"),Character("c")),(Character("b"),Character("c")) ] )
            }
        }
    }

我可以转换为字符串,但我认为有更好的解决方案。

如何测试成对的字符对[[Character,Character)]

的输出

1 个答案:

答案 0 :(得分:1)

您的非标量概念是完全红色鲱鱼。问题是公平性之一。

  

如何测试由字符对[(Character,Character)]组成的数组的输出

您不能,因为没有默认概念将两个这样的数组等同起来。这是一个古老的“等式元组不是等式元组”问题(https://bugs.swift.org/browse/SR-1222),它仍然用数组来抬头。 ==运算符通过一种魔法在元组上工作,但是它们在形式上仍然不相等。

您可以自己定义字符对数组的等效性:

typealias CharPair = (Character,Character)
func ==(lhs:[CharPair], rhs:[CharPair]) -> Bool {
    if lhs.count != rhs.count {
        return false
    }
    let zipped = zip(lhs,rhs)
    return zipped.allSatisfy{$0 == $1}
}

或者,让您的pairsOfChars返回更容易等于的东西,例如定义了Equatable的结构的数组。

例如:

struct CharacterPair : Equatable {
    let c1:Character
    let c2:Character
    // in Swift 4.2 this next bit is not needed
    static func ==(lhs:CharacterPair, rhs:CharacterPair) -> Bool {
        return lhs.c1 == rhs.c1 && lhs.c2 == rhs.c2
    }
}

func pairsOfChars(_ s: String) -> [CharacterPair] {
    let strArray = Array(s)
    var outputArray = [CharacterPair]()
    for i in 0..<strArray.count - 1 {
        for j in i + 1..<strArray.count {
            outputArray.append(CharacterPair(c1:strArray[i],c2:strArray[j]))
        }
    }
    return outputArray
}

然后您将重写测试以匹配:

XCTAssertEqual(
    pairsOfChars("abc"),
    [CharacterPair(c1:Character("a"),c2:Character("b")), 
         CharacterPair(c1:Character("a"),c2:Character("c")),
         CharacterPair(c1:Character("b"),c2:Character("c"))]
)