Модульное тестирование с Pex и кодовыми контрактами - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть следующий метод:

public static DateTime SubQtrs( this DateTime dt, int qtrs )
{
    Contract.Requires( qtrs > -1 );
    Contract.Requires( ( qtrs * 3 ) >= -120000 && ( qtrs * 3 ) <= 120000 );
              // do something
     }

Я создал параметризованный модульный тест и использовал Pex для создания какого-то модульного теста.Как и ожидалось, Пекс протестировал ограничения контракта и передал значение qtrs, которое нарушило контракт.Я сказал модульному тесту ожидать исключения с: [ExpectedException (typeof (TraceAssertionException))] и все прошло.

Теперь, когда я просто запускаю модульный тест с помощью MS Test Harness (без Pex), я получаюошибка: Descrtipion: Не выполнено предварительное условие: (qtrs * 3> = -120000 && ......

Это дает мне трассировку стека, в основном сообщающую мне, что сработал контрактный помощник. Затем мне предоставляется выбор:Прервать, повторить или игнорировать.

В любом случае, тест не пройден, и я получаю: Failed SubQtrsThrowsTraceAssertionException818 DGALib.Extensions.Tests Метод теста System.ExtensionMethodsTest.SubQtrsThrowsTraceAssertionException88 исключение исключения, исключение переполнения, исключение исключения..Exceptions.TraceAssertionException ожидалось. Сообщение об исключении: System.ArgumentOutOfRangeException: значение месяца должно быть в диапазоне +/- 120000. ... *

Почему модульный тест больше не распознает ошибку контракта кода?

Ответы [ 2 ]

0 голосов
/ 04 января 2012

Кажется, что тесты, которые бросали этот экран, отсутствовали [HostType ("Moles")].

Я сравнил тест, который вызывал проблему, с другим тестом, который также должен был генерировать утверждение трассировки и не вызывал проблемы. Единственным отличием было то, что причина, по которой проблема отсутствовала [HostType ("Moles")] Как только я добавил этот атрибут, тест сработал.

Должна быть ошибка в контрактах, которые, должно быть, пузырились откуда-то еще и отправляли меня в погоню за диким гусем.

Пекс, должно быть, создал этот тест, прежде чем я начал добавлять родинки в остальные сценарии тестирования.

0 голосов
/ 13 декабря 2011

Похоже, что вы не запускаете программу переписывания контрактов на сборке, когда запускаете модульное тестирование вручную, так что контракты Required никогда не приводят к исключениям.Вместо этого звучит так, как будто у вас есть некоторый код ручной проверки в вашем методе, который выдает ArgumentOutOfRangeException, который является правильным поведением (во время выполнения, без переписывания контракта), но не соответствует ожидаемому исключению для теста.Убедитесь, что у вас установлен переписчик Code Contracts и убедитесь, что настройки Project включают перезапись с исключениями.

В качестве альтернативы используйте перегрузку Require, которая задает тип Exception, чтобы он соответствовал внутренней проверке.В этом случае вы можете даже удалить другое явное исключение, если вы знаете, что планируете использовать переписывание.

Contract.Requires<ArgumentOutOfRangeException>( ( qtrs * 3 ) >= -120000 && ( qtrs * 3 ) <= 120000 , "qtrs");
...