Contents tagged with defensive programming

  • Модульное тестирование и контракты

    Tags: tdd, code contracts, unit testing, defensive programming

    Я давно хотел попробовать использовать контракты в дизайне своего кода, но всё как-то руки не доходили. Для целей defensive programming мне было вполне достаточно привычного подхода if-then-throw в начале каждого метода. Однако, руки наконец-то дошли, подвернулся новый несложный проект, и я решил включить эту технику в свой инвентарь. Как минимум это позволит мне писать более безопасный код, так как я буду проверять не только предусловия, но и постусловия и состояние объектов. И сразу же возник вопрос: “как такой код тестировать”. Вроде бы всё просто, заменяй тип ожидаемого исключения в модульных тестах с разнообразных ArgumentException, ArgumentNullException на тип, который используется при нарушении контрактов, но не тут-то было! Действительно контракты выбрасывают, при своём нарушении, исключение типа ContractException, но этот тип объявлен внутренним (internal).

    То есть подобный код просто не будет скомпилирован:

            [TestMethod]
            [ExpectedException(System.Diagnostics.Contracts.ContractException)]
            public void TestMethodName()
            {
                new ClothesStyle(null, 0);
            }
    

    Read more...