🔍

[Swift] Setに対してAssertEqualするときはsubstractingを使うとログが見やすい

2022/04/12に公開

二つのSetが等しいかをテストしたい場合、素直にはXCTAssertEqual(setx, sety)とやればいいのですが、この方法だと等しくなかった場合に非常にログが見づらくなります。特にSetは順序が固定でないため、どこが違うのか全くわからないことも多いです。

そこで、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 ("[]")
}

Discussion