CloseEnough

使用 @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 属性包装器!