tSQLt AssertEqualsTable не проверяет порядок
У меня есть две таблицы, определенные для фактических и ожидаемых с одинаковой схемой. Я вставляю две строки в ожидаемую таблицу, например, с идентификаторами 2, 1.
я бегу
INSERT INTO actual EXEC tSQLt.ResultSetFilter 1, '{statement}'
чтобы заполнить фактическое тогда
EXEC tSQLt.AssertEqualsTable @expected = 'expected' , @actual = 'actual'
сравнить результаты.
Даже если данные находятся в другом порядке (идентификаторы равны 1, 2 в действительности), тест проходит успешно.
Я подтвердил, что данные отличаются, добавив SELECT * FROM фактический и SELECT * FROM, ожидаемый в тесте, и запустив тест самостоятельно с tSQLt.Run '{test name}'.
Кто-нибудь знает, если это известная ошибка? По-видимому, он должен проверять каждую строку, поэтому следует проверить порядок. Все остальные столбцы имеют значение NULL, которые возвращаются, это просто столбец ID, который содержит значение.
1 ответ
Если в операторе выбора не указано условие order by, порядок не гарантируется SQL-сервером (см. Верхнюю границу на этой странице MSDN) - хотя на практике он часто упорядочивается, как и следовало ожидать.
Поэтому я считаю, что tSQLt, ищущий неидентичные и идентичные строки, имеет смысл - но проверка порядка не имеет значения - в противном случае ответ мог бы измениться по прихоти SQL-сервера, и тест был бы бессмысленным (и, что еще хуже, периодически прерывался)!). Руководство пользователя tSQLt для AssertEqualsTable гласит, что оно проверяет содержимое таблицы, но не проверяет порядок в ней. Что заставляет вас сделать вывод, что заказ также должен быть проверен? Я не мог найти упоминания об этом.
Если вам нужно проверить порядок, вы можете вставить как ожидаемые, так и фактические результаты во временную таблицу со столбцом идентификаторов (или использовать ROW_NUMBER) и проверить результирующую таблицу - если порядок отличается, то столбцы идентификаторов будут другими.
Подобный метод описан здесь в блоге Грега М. Лукаса.
Не рекомендуется полагаться на порядок, возвращаемый из таблицы без предложения order by ( ссылка на MSDN), поэтому я бы предложил включить его в вызов вашего приложения к оператору или, если SP внутри него, если важен порядок возвращаемых строк,