我想测试我的接受字符串的函数,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)]
的输出答案 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"))]
)