此包用于参数化测试。
EG
- (“例如”) - 一个用于保存输入和输出的结构体。您通常创建一个 EG
值数组,然后将它们传递给 check()
方法。
EG 的字段
#file
,因此您通常省略此参数。#line
,因此您通常省略此参数。示例
EG("abcd", expect: 4, "length > 0")
msg()
- 提供来自 EG 结构体的消息,并以其行号为前缀。您可以将其用作断言的消息。
EGAssertEqual()
- 调用 XCTAssertEqual,并传递来自 EG 实例的期望值、消息、文件和行号。如果实际类型不可相等,您需要直接使用 XCTAssertEqual。
func EGAssertEqual<T: Equatable, Input>(
_ actual: T,
_ expected: EG<Input, T>
)
EGAssertEqual()
- 调用 XCTAssertEqual,并传递来自 EG 实例的期望值、精度、消息、文件和行号。如果实际类型不可相等,您需要直接使用 XCTAssertEqual。
func EGAssertEqual<T: Equatable, Input>(
_ actual: T,
_ expected: EG<Input, T>,
accuracy: T
) where T: FloatingPoint
EGAssertThrowsError()
- 调用 XCTAssertThrowsError,并传递表达式、来自示例的消息以及一个可选的函数,该函数可以比较示例和错误。
public func EGAssertThrowsError<Ignored, Input, Expected: Equatable>(
_ expression: @escaping @autoclosure () throws -> Ignored,
_ example: EG<Input, Expected>
)
以及
public func EGAssertThrowsError<Ignored, Input, Expected: Equatable>(
_ expression: @escaping @autoclosure () throws -> Ignored,
_ example: EG<Input, Expected>,
_ errorHandler: (EG<Input, Expected>, Error) -> Void
)
eg()
- 允许您使用小写名称 eg
创建 EG
示例。接受与 EG
结构体相同的参数。
check()
- 针对断言运行测试用例列表。对于 XCT 断言函数,传入文件和行,以便在断言失败时突出显示您的测试用例。通常,首选可变参数形式,但如果您需要,也可以使用数组形式。
func check<Input, Output>(
_ tests: EG<Input, Output>...,
assertFunction: (EG<Input, Output>) -> ()) {...}
或
func check<Input, Output>(
_ tests: [EG<Input, Output>],
_ assertFunction: (EG<Input, Output>) -> ()) {...}
check() throws
- 类似于 check(),但允许您调用可能失败的断言。通常,首选可变参数形式,但如果您需要,也可以使用数组形式。
func check<Input, Output>(
_ tests: EG<Input, Output>...,
assertFunction: (EG<Input, Output>) throws -> Void
) throws
或
func check<Input, Output>(
_ tests: [EG<Input, Output>],
_ assertFunction: (EG<Input, Output>) throws -> Void
) throws
allPairs()
- 创建任何类型对的列表。
func allPairs<T1, T2>(
_ t1s: [T1],
_ t2s: [T2])
-> [(T1,T2)]
allTriples()
- 创建任何类型三元组的列表。
func allTriples<T1, T2, T3>(
_ t1s: [T1],
_ t2s: [T2],
_ t3s: [T3])
-> [(T1, T2, T3)]
请注意,XCTAssertEqual
调用传递了文件和行。为了查看报告的差异,请使一个测试用例失败并运行它,然后将其与省略文件和行时发生的情况进行比较。第二个示例显示了使用 EGAssertEqual 的相同测试。
class Demo {
func stringOfSum(_ a: Int, _ b: Int) -> String {
return "\(a + b)"
}
}
final class ExampleTests: XCTestCase {
func testStringOfSumAllPass() {
check([
EG((-1, 1), expect: "0", "zero"),
eg((3, 0), expect: "3", "one-digit"),
eg((-2, 1), expect: "-1", "negative")
]) { example in
let my = Demo()
let actual = my.stringOfSum(example.input.0, example.input.1)
XCTAssertEqual(actual, example.expect, example.msg(), file: example.file, line: example.line)
}
}
}
final class ExampleTests2: XCTestCase {
func testStringOfSumAllPass() {
check([
EG((-1, 1), expect: "0", "zero"),
eg((3, 0), expect: "3", "one-digit"),
eg((-2, 1), expect: "-1", "negative")
]) { example in
let my = Demo()
let actual = my.stringOfSum(example.input.0, example.input.1)
EGAssertEqual(actual, example)
}
}
}
func iAlwaysThrow() throws { throw "I threw" }
func testAssertThrowsSucceeds_WhenThrownAndErrorIsRight() {
EGAssertThrowsError(try self.iAlwaysThrow(), eg("ignored", expect: "I threw")) { example, error in
let actualMessage: String = error as! String
EGAssertEqual(actualMessage, example)
}
}