テストを階層化する - XCTContext
テストを階層化して表現したいと思った時に使えるのが、XCTContext.runActivity
。
func safeDivision(_ x: Int, _ y: Int) -> Int? { if y == 0 { return nil } else { return x/y } }
上に対するテストが以下。
func testSafeDivision() { // 通常の割り算 XCTAssertEqual(safeDivision(6, 3), 2) XCTAssertEqual(safeDivision(6, 2), 3) // 0除算 XCTAssertNil(safeDivision(6, 0)) }
これをXCTContext.runActivity
を使ってグルーピングする。
func testSafeDivision() { XCTContext.runActivity(named: "通常の割り算") { _ in XCTAssertEqual(safeDivision(6, 3), 2) XCTAssertEqual(safeDivision(6, 2), 3) } XCTContext.runActivity(named: "0除算") { _ in XCTAssertNil(safeDivision(6, 0)) } }
さらにネストさせることも可能。ただし可読性については意識すること!
func testSafeDivision() { XCTContext.runActivity(named: "通常の割り算") { _ in XCTContext.runActivity(named: "6 / 3 = 2") { _ in XCTAssertEqual(safeDivision(6, 3), 2) } XCTContext.runActivity(named: "6 / 2 = 3") { _ in XCTAssertEqual(safeDivision(6, 2), 3) } } XCTContext.runActivity(named: "0除算") { _ in XCTAssertNil(safeDivision(6, 0)) } }
Quickではより複雑な構造化が可能。