使用 @CloseEnough
标记您的浮点数或类似浮点数的值,然后在对其父结构体使用 XCTAssertEqual
进行比较时,使用给定的精度进行比较。这很有用,因为虽然 XCTAssertEqual
提供了一个变体,它接受一个浮点精度参数,但它不适用于结构体内部的值,也不适用于您的自定义类型。CloseEnough解决了这两个问题。
要启用测试中属性的模糊比较,请使用 @CloseEnough
属性包装器对其进行注解
struct Outer: Equatable {
@CloseEnough
var foo: Double
@CloseEnough
var bar: Date
var inner: Inner // it works for nested structs too!
}
struct Inner: Equatable {
@CloseEnough
var baz
}
您必须为正在比较的结构体(包括嵌套结构体)中存在的每种类型提供一个精度值。 否则,将会产生测试失败,告诉您忘记为哪些类型表达精度。 如果您想进行没有模糊性的比较,请提供精度 0(或您类型的加法单位元)。
// Tests
withPrecisions([
Double.self: 0.0001,
Date.self: TimeInterval(10), // When comparing dates, difference is expressed as a time interval
]) {
XCTAssertEqual(
someValue,
Outer(
foo: 1.5,
bar: Date(timeIntervalSinceReferenceDate: 1234),
inner: Inner(
baz: 11
)
)
)
}
如果您的类型可以从近似比较中受益,请使其符合 EquatableWithPrecision
协议,并实现所需的方法 isApproximatelyEqual(to:precision:)
。 然后,您可以在自己的代码中使用 @CloseEnough
属性包装器!