XCTAssertEqual不适用于double值

Way*_*man 31 unit-testing objective-c

我正在为我正在编写的地图坐标函数编写一些单元测试.不幸的是,XCTest正在发生一些事情,我无法确定是否导致我的测试失败:

NSString *testValue = @"121°31'40\"E";

double returnValue = coordinateStringToDecimal(testValue);
static double expectedValue = 121.5277777777778;
XCTAssertEqual(returnValue, expectedValue, @"Expected %f, got %f", expectedValue, returnValue);
Run Code Online (Sandbox Code Playgroud)

我确实读过这个类似的问题来排除故障.但是,我能够验证数字和类型是否相同.以下是检查每个值类型的控制台输出:

(lldb) print @encode(__typeof__(returnValue))
(const char [2]) $5 = "d"
(lldb) print @encode(__typeof__(expectedValue))
(const char [2]) $6 = "d"
Run Code Online (Sandbox Code Playgroud)

调试器中的变量视图显示它们是相同的:

在此输入图像描述

有趣的是在lldb中比较它们的控制台输出:

(lldb) print (returnValue == expectedValue)
(bool) $7 = false
Run Code Online (Sandbox Code Playgroud)

类型相同,实际数字相同.为什么我的断言会失败?

Way*_*man 73

因为您正在处理浮点数,所以即使在double值之间也会存在一定程度的不准确性.在这些情况下,您需要使用不同的断言:XCTAssertEqualWithAccuracy.来自文档:

当a1在+或 - 精度内不等于a2时生成失败.此测试适用于浮标和双打等标量,其中较小的差异可能使这些项目不完全相同,但适用于所有标量.

将您的断言更改为以下内容:

XCTAssertEqualWithAccuracy(returnValue, expectedValue, 0.000000001);
Run Code Online (Sandbox Code Playgroud)

或者在Swift 4中:

XCTAssertEqual(returnValue, expectedValue, accuracy: 0.000000001, "expected better from you")
Run Code Online (Sandbox Code Playgroud)

在Nimble:

expect(expectedValue).to(beCloseTo(returnValue, within: 0.000000001))
Run Code Online (Sandbox Code Playgroud)

  • 在swift 3中,添加了一个`accuracy`参数标签:`XCTAssertEqualWithAccuracy(returnValue,expectedValue,precision:0.000000001,"期望你更好"); (2认同)

Joc*_*zer 5

在Swift 4中,从函数名称中删除了准确性-现在,它的XCTAssertEqual重载:

XCTAssertEqual(returnValue, expectedValue, accuracy: 0.000000001, "expected better from you")
Run Code Online (Sandbox Code Playgroud)