Swift 测试中的NSDate比较

Swift 测试中的NSDate比较,swift,unit-testing,nsdate,sqlite.swift,Swift,Unit Testing,Nsdate,Sqlite.swift,我正在编写一些测试,以查看person对象是否正确地保存到本地数据库(SQLite,使用日期字符串) 在我的测试中,我有: let testPerson = Person(firstName:"John", lastName:"Doe") 保存到数据库后,我测试createdAt!=零 没关系!然后: let testPerson2 = Person.LoadByID(testPerson.id) 这是一个将person对象从数据库加载到testPerson2的静态函数 所有字段都通过了测试

我正在编写一些测试,以查看person对象是否正确地保存到本地数据库(SQLite,使用日期字符串)

在我的测试中,我有:

let testPerson = Person(firstName:"John", lastName:"Doe")
保存到数据库后,我测试createdAt!=零

没关系!然后:

let testPerson2 = Person.LoadByID(testPerson.id)
这是一个将person对象从数据库加载到testPerson2的静态函数

所有字段都通过了测试(因此除了createdAt和updateAt日期之外,testPerson和testPerson2的字段完全相同)

如果我打印这些日期,它们完全一样:

testPerson.createdAt : Optional(2015-08-14 12:03:01 +0000)
testPerson2.createdAt :Optional(2015-08-14 12:03:01 +0000)
但是测试(通过两种不同的方法):

失败

使用2x testPerson或testPerson2进行这些测试,成功

我还尝试了以下代码:

if testPerson.createdAt!.compare(testPerson.createdAt!) == NSComparisonResult.OrderedDescending
        {
            println("date1 after date2");
        } else if testPerson.createdAt!.compare(testPerson.createdAt!) ==     NSComparisonResult.OrderedAscending
        {
            println("date1 before date2");
        } else
        {
            println("dates are equal");
        }
如果使用testPerson和testPerson2失败,则使用testPerson/testPerson和testPerson2/testPerson2成功


为什么?Println和查看数据库本身看起来正常。

内部NSDate的分辨率至少为一纳秒。您的dateFormatter会删除大部分分辨率,因为dateformat
ss.SSS
只处理毫秒

如果您不需要纳秒精度,我建议您只检查毫秒级的日期。我通常使用
xctasertequalwithaccurity()

e、 g:


您的输出不能证明日期是完全相同的,因为NSDate在内部将其时间表示为精度低于秒的浮点值。我发现您的createdAt是一个可选字段。因此,比较它们可能不是您想要的,您首先需要打开可选字段。其次,即使您打开它们==运算符也不起作用对于NSDate,用户可以在后面的代码段中进行比较。此外,这两个日期在毫秒级的分数处可能不同。这可能会使它们都不同。为了使您的工作更轻松,请查看此库以便于处理日期。在毫秒级,它们应该与testPerson中的createdAt完全相同保存到SQLite中,然后恢复到testPerson2中的createdAt中,并在我的单元中进行比较tests@Glenn:日期是否以实数形式存储在SQLite数据库中?否则精度可能会丢失。日期之间的差异有多大(
date1.timeintervalncedate(date2)
)?
XCTAssertTrue(testPerson2.createdAt!.isEqualToDate(testPerson2.createdAt!), "createdAt should be the same")
if testPerson.createdAt!.compare(testPerson.createdAt!) == NSComparisonResult.OrderedDescending
        {
            println("date1 after date2");
        } else if testPerson.createdAt!.compare(testPerson.createdAt!) ==     NSComparisonResult.OrderedAscending
        {
            println("date1 before date2");
        } else
        {
            println("dates are equal");
        }
XCTAssertEqualWithAccuracy(date1.timeIntervalSinceReferenceDate,
                           date2.timeIntervalSinceReferenceDate,
                           0.001, 
                           "")