tSQLt ExpectException у меня не работает

У меня есть тест, который вызывает хранимую процедуру. Я ожидаю, что хранимая процедура отклонит предоставленный ввод с ошибкой. Соответствующая часть моего теста tSQLt:

EXEC tSQLt.ExpectException @ExpectedMessagePattern = '% более одной подкатегории%';
EXEC usp_add_rfx_rfx много, из, параметров, здесь

Результат теста tSQLt зависит от серьезности ошибки, связанной с usp_add_rfx_rfx sp.

Если серьезность 12 или более, тест не проходит с этим сообщением:

[test_RFX_configuration]. [test_multiple_categories_and_lots] не удалось: (Ошибка) Счетчик транзакций после EXECUTE указывает на несовпадающее количество операторов BEGIN и COMMIT. Предыдущее количество = 1, текущее количество = 0. [16,2] {test_multiple_categories_and_lots, 0} (также была ОШИБКА ROLLBACK -> Запрос ROLLBACK TRANSACTION не имеет соответствующей BEGIN TRANSACTION. {Private_RunTest, 149})

Если серьезность меньше, тест не проходит следующим образом:

[test_RFX_configuration]. [test_multiple_categories_and_lots] не удалось: (Failure) Ожидается ошибка.

Я погуглил проблему и попробовал несколько вещей, которые нашел - с помощью TRY-CATCH и т. Д., Но без радости. Любые идеи?


person Resource    schedule 08.06.2016    source источник


Ответы (1)


Эта ошибка выглядит так, как будто тестируемый sproc (ups_add_rfx_rfx) имеет встроенную обработку транзакций. Аналогичный вопрос по переполнению стека Как ОТКАТИТЬ транзакцию при тестировании с использованием tSQLt и по этому вопросу Себастьян, один из авторов tSQLt, ссылается на одну из своих публикаций в блоге об одном подходе для решения этой проблемы как выполнить откат в процедурах.

person datacentricity    schedule 09.06.2016
comment
Спасибо за предложение, датацентричность. Я уже прочитал и вопрос, и статью, на которую есть ссылка, и изучил предложения Себастьяна. Я попробовал все ответы, предложенные в вопросе! ups_add_rfx_rfx обрабатывает транзакцию, но возникает ошибка до НАЧАЛА ТРАНЗАКЦИИ. Я удалил транзакцию из usp_add_rfx_rfx для анализа, и это не устранило проблему. Я пришел к выводу, что на транзакцию tSQLt напрямую влияет raiserror. - person Resource; 09.06.2016
comment
Лучший вариант - опубликовать код - как sproc (или уменьшенную версию, которая все еще представляет ошибку), так и тест, тогда, возможно, мы сможем разобраться в сути проблемы - или найти обходной путь. Я использую немного другой шаблон, чем тот, который изначально был предложен Себастьяном (IIRC), поэтому, если вы опубликуете свой код, я попытаюсь воссоздать проблему в своей среде и посмотреть, решит ли мой шаблон проблему. - person datacentricity; 09.06.2016
comment
датацентричность - когда я вернулся и проверил, я понял, что среди всех моих исправлений транзакции снова были включены в конце. - person Resource; 10.06.2016
comment
В моем блоке catch происходил дополнительный откат, как вы и предсказывали. Я разделил блоки try-catch - один для предварительных условий и один для кода транзакции. После этого изменения ExpectException удовлетворяется в моем тесте. Это все еще не совсем верно - фактическое выброшенное исключение не то, что я ожидал, возможно, из-за функции ведения журнала в середине. Это нормально. Сначала запустив тест ExpectNoException, я могу затем изменить только соответствующий параметр и проверить, возникло ли исключение. - person Resource; 10.06.2016