🔍
[Swift] Setに対してAssertEqualするときは差分を比較するとログが見やすい
二つのSetが等しいかをテストしたい場合、素直にはXCTAssertEqual(setX, setY)とやればいいのですが、この方法だと等しくなかった場合に非常にログが見づらくなります。特にSetは順序が固定でないため、どこが違うのか全くわからないことも多いです。
そこで、集合同士の差を取るsubtractingを使い、setXからsetYの元を除いたもの、setYからsetXの元を除いたものがそれぞれ空集合であるかを調べると、ログが見やすくなります。
func testSets() throws {
let setX = Set([0, 1, 2, 3, 4, 5])
let setY = Set([0, 1, 2, 4, 5, 6])
// これだとログが見づらい
XCTAssertEqual(setX, setY) // XCTAssertEqual failed: ("[3, 4, 0, 1, 5, 2]") is not equal to ("[4, 6, 2, 5, 0, 1]")
// こうすると違いが分かり易い!
XCTAssertEqual(setX.subtracting(setY), []) // XCTAssertEqual failed: ("[3]") is not equal to ("[]")
XCTAssertEqual(setY.subtracting(setX), []) // XCTAssertEqual failed: ("[6]") is not equal to ("[]")
// `symmetricDifference`も使える(ただし、どれがどちらの集合に存在したのかはわからない)
XCTAssertEqual(setX.symmetricDifference(setY), []) // XCTAssertEqual failed: ("[3, 6]") is not equal to ("[]")
}
Discussion