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 внутри него, если важен порядок возвращаемых строк,

Другие вопросы по тегам