Как настроить Pex на соблюдение контрактов кода?


Учитывая следующий пример кода, как я могу настроить 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, он все еще генерирует тестовые случаи, которые нарушают указанные контракты кода.

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


EDIT: что-то сломалось в SP1 ?

5 7

5 ответов:

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

Используйте ArgumentNullException как T

Также в свойствах проекта вам нужно указать code cotracts использовать стандартный рерайтер. Не нажимайте assert при сбое;)

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

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

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

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

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

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

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

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

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

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

Хонза

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

Это, по-видимому, необходимо для понимания контрактов Pex.

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

Необходимо также включить в свойствах решения функцию "выполнить проверку контракта во время выполнения".

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

Есть также связанный PexAllowedContractRequiresFailureAtTypeUnderTestSurface, который, я думаю, может быть полезен, если "требования", которые вы хотите, чтобы Pex уважал, находятся глубже в дереве вызовов.