Как вы настраиваете Pex для соблюдения кодовых контрактов? - PullRequest
7 голосов
/ 27 мая 2011

Учитывая следующий пример кода, как я могу настроить Pex для соблюдения моих контрактов кода?

    public static IEnumerable<User> Administrators(this UserGroup userGroup)
    {
        Contract.Requires(userGroup != null);
        Contract.Requires(userGroup.UserList != null);

        return userGroup.UserList.Where(ul => ul.IsAdmin == true);
    }

Текущая проблема: когда я запускаю Pex, он все еще генерирует тестовые случаи, которые нарушают указанные кодовые контракты.

К вашему сведению: Вот настройки «Контрактов кодов» в моем файле csproj.


РЕДАКТИРОВАТЬ: Что-то сломался в SP1 ?

Ответы [ 5 ]

4 голосов
/ 24 июня 2011

Сначала вам нужно использовать печатную версию Требуется

используйте ArgumentNullException в качестве T

Также в свойствах вашего проекта вы должны указать кодам Cotracts использовать стандартный переписчик. НЕ нажимайте кнопку «Утвердить при неудаче»;)

Contract.Requires<ArgumentNullException>(i != null);

тогда ваш код сгенерирует исключение argumetn null, и pex может добавить атрибут к вашему pexmethod, чтобы сказать, что ему разрешено выбрасывать его, и создаст проходной тест, который сгенерирует исключение

затем вы можете продвинуть их и сохранить модульные тесты

3 голосов
/ 27 мая 2011

Он нарушает контракты с целью убедиться, что при нарушении контракта возникает исключение. Многие люди скомпилируют методы требовать в сборке выпуска, где некоторые скажут, что крайние случаи все еще должны быть обработаны. Также можно написать собственный обработчик ошибок контракта, который не может генерировать исключение или ошибку подтверждения. Если у вас есть собственный обработчик ошибок контракта, который не препятствует дальнейшему выполнению, вы можете вызвать еще большие проблемы в дальнейшем.

Что Pex делает, так это пишет тесты, которые нарушают контракт, чтобы он проходил при возникновении исключения.

TL / DR Вам не стоит об этом беспокоиться.

1 голос
/ 31 января 2013

Мне также пришлось включить Contract Reference Assembly в Build (я также отправил XML-файл документа, чтобы я мог видеть контракты в VS).

Это, кажется, необходимо для Пекса, чтобы понятьконтракты.

1 голос
/ 09 декабря 2011

У меня была такая же проблема. Есть две вещи:

1) Убедитесь, что перезапись во время выполнения включена (как предлагает Джон)

2) Убедитесь, что ваш тестовый класс украшен [PexClass (typeof (MyClass))]]

Я написал тест вручную, поэтому я забыл, что атрибут PexClass и контракты были обработаны Pex как обычные исключения - поэтому они терпели неудачу.

Хонза

0 голосов
/ 05 июня 2013

Существует атрибут PexAllowedContractRequiresFailure, который вы можете украсить свой метод тестирования, чтобы указать Pex не генерировать тесты, которые приводят к сбою требования.

Вы также должны включить «Выполнить проверку контракта во время выполнения» в свойствах своего решения.

[TestClass]
public partial class MyTest
{
   [PexMethod]
   [PexAllowedContractRequiresFailure]
   public void TestMethod(int myParam)
   {
      Contract.Requires(myParam > 5);
      ...
   }
}

Существует также связанный PexAllowedContractRequiresFailureAtTypeUnderTestSurface, который, я думаю, может быть полезен, если «Требуется»ты хочешь, чтобы Пекс почитал глубже в дереве вызовов.

...