Подтвердить что ты не робот

XCTAssertEqual не работает для двойных значений

Я пишу некоторые модульные тесты для координатной функции карты, которую я пишу. К сожалению, что-то происходит с 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);

Я прочитал этот аналогичный вопрос для устранения неполадок. Тем не менее, я могу подтвердить, что числа и типы одинаковы. Вот консольный вывод проверки типа каждого значения:

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

Просмотр переменных в отладчике показывает, что они одинаковы:

enter image description here

Интересным является консольный вывод для сравнения их в lldb:

(lldb) print (returnValue == expectedValue)
(bool) $7 = false

Типы те же, и фактические цифры одинаковы. Почему еще мое утверждение будет терпеть неудачу?

4b9b3361

Ответ 1

Поскольку вы имеете дело с числами с плавающей запятой, всегда будет определенная степень неточности, даже между значениями double. В этих случаях вам нужно использовать другое утверждение: XCTAssertEqualWithAccuracy. Из документов:

Генерирует сбой, когда a1 не равно a2 в пределах + или - точности. Этот тест предназначен для скаляров, таких как float и double, где небольшие различия могут сделать эти элементы не совсем одинаковыми, но работает для всех скаляров.

Измените свой аргумент на что-то вроде этого:

XCTAssertEqualWithAccuracy(returnValue, expectedValue, 0.000000001);

Ответ 2

В Swift 4 точность была удалена из имени функции - теперь это перегрузка XCTAssertEqual:

XCTAssertEqual(returnValue, expectedValue, accuracy: 0.000000001, "expected better from you")