【问题标题】:XCTAssertEqual: How to compare NSDates?XCTAssertEqual:如何比较 NSDates?
【发布时间】:2013-11-15 14:37:36
【问题描述】:
NSDate *date = [NSDate date];
XCTAssertEqual([[store selectedDate] timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate]);

这给了我错误信息:

(([[store selectedDate] timeIntervalSinceReferenceDate]) equal to ([date timeIntervalSinceReferenceDate])) failed: 
("405290648.294") is not equal to ("405290648.294")

我之前遇到过类似的整数问题,必须通过将其转换为NSUInteger 来解决,如here. 所述

但我不知道如何使用 NSDate 对象/双打来解决这个问题(如本例所示)。

【问题讨论】:

    标签: ios unit-testing ios7 xctest


    【解决方案1】:

    问题在于,这两个 double 值的不同之处可能比断言中显示的高一位(可能是 405290648.2942405290648.2941)。

    如果您不关心比较中的小数秒,请在两个值上使用 roundfloor,或者将两者都转换为 long long

    【讨论】:

      【解决方案2】:

      使用XCTAssertEqualWithAccuracy 比较浮点数

      XCTAssertEqualWithAccuracy([[store selectedDate] timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate], 0.001);
      

      【讨论】:

      • 谢谢?!在 Swift 中,您现在可以在没有“WithAccuracy”部分的情况下使用它。只需在末尾添加“准确度”参数即可。
      【解决方案3】:

      如果您运行一个简单的测试,您会发现这些值是不同的。它们在断言输出中看起来相同的事实很可能与构建日志输出的方式有关。

      NSDate *date  = [NSDate date];
      NSDate *date2 = [NSDate date];
      
      NSLog(@"%f %f", [date2 timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate]); //=> 405292099.192900 405292099.192899
      
      XCTAssertEqual([date2 timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate]);
      

      您应该使用XCTAssertEqualWithAccuracy,因为它们本质上是double

      【讨论】:

        【解决方案4】:

        这应该可以工作,并且对于测试来说应该足够了。

        XCTAssertEqualWithAccuracy([refDate timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate],0.00001,@"");
        

        【讨论】:

          【解决方案5】:

          在早期的 Swift 中你需要使用这个:

          let receivedDateTimeInterval = receivedDate.timeIntervalSinceReferenceDate
          let expectedDateTimeInterval = expectedDate.timeIntervalSinceReferenceDate
          XCTAssertEqualWithAccuracy(receivedDateTimeInterval, expectedDateTimeInterval, accuracy: 0.001)
          

          现在你可以失去“WithAccuracy”部分了:

          XCTAssertEqual(receivedDateTimeInterval, expectedDateTimeInterval, accuracy: 0.001)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-01-28
            • 2013-10-28
            • 2017-01-04
            • 2014-08-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多