2015-03-08 2 views
1

Я новичок в контрактах, и я взял из обзора, что он может помочь вам во время компиляции для обнаружения нарушений контракта.Как получить предупреждения/ошибки контракта на компиляцию

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

Я бы ожидал, что строка кода в тесте, которая устанавливает Person.Name = null, даст мне предупреждение или сообщение об ошибке, так как оно нарушает договор.

Как я могу настроить свой код для получения сообщений времени компиляции?

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

Код тестируемой:

using System; 
using System.Diagnostics.Contracts; 

namespace DomainModel 
{ 
    [ContractClass(typeof(IPersonContract))] 
    public interface IPerson 
    { 
     string Name { get; set; } 
    } 

    [ContractClassFor(typeof(IPerson))] 
    public abstract class IPersonContract : IPerson 
    { 
     private IPersonContract() { } 

     string IPerson.Name 
     { 
      get 
      { 
       throw new NotImplementedException(); 
      } 
      set 
      { 
       Contract.Ensures(!string.IsNullOrEmpty(value)); 
      } 
     } 
    } 

} 

А вот мой тест:

using Moq; 
using NUnit.Framework; 
using DomainModel; 

namespace Unit 
{ 
    /// <summary> 
    /// A test class for IPerson 
    /// </summary> 
    [TestFixture()] 
    public class IPersonShould 
    { 

     #region "Unit Tests" 

     [Test()] 
     public void ThrowWhenIPersonIsGivenEmptyName() 
     { 
      //set up 
      IPerson IPerson = this.Person; 
      string expectedResult = null; 
      //Dim NameParam1 as String = Nothing 
      Person.Name = null; // Would expect this line to generate warning or error 
      //perform test 
      string actualResult = IPerson.Name; 

      //compare results 
      Assert.AreEqual(expectedResult, actualResult); 

     } 
     #endregion 

     #region "Setup and Tear down" 

     private class MyPerson : IPerson { 

      private string name; 
      public string Name 
      { 
       get 
       { 
        return name; 
       } 
       set 
       { 
        name = value; 
       } 
      } 
     } 

     private MyPerson Person; 

     /// <summary> 
     /// This runs only once at the beginning of all tests and is used for all tests in the 
     /// class. 
     /// </summary> 
     [TestFixtureSetUp()] 
     public void InitialSetup() 
     { 
      Person = new MyPerson(); 
     } 

     /// <summary> 
     /// This runs only once at the end of all tests and is used for all tests in the class. 
     /// </summary> 
     [TestFixtureTearDown()] 
     public void FinalTearDown() 
     { 
     } 

     /// <summary> 
     /// This setup function runs before each test method 
     /// </summary> 
     [SetUp()] 
     public void SetupForEachTest() 
     { 

     } 

     /// <summary> 
     /// This setup function runs after each test method 
     /// </summary> 
     [TearDown()] 
     public void TearDownForEachTest() 
     { 

     } 

     #endregion 

    } 

} 

А вот мои текущие настройки: enter image description here

ответ

0

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

Есть несколько способов, которые контракты Код пытается помочь:

  1. Комментирование классы с контрактами предоставляет третьим сторонних разработчиков, которые ссылаются на вашу библиотеку и, которые также используют код контракты, чтобы узнать, действительно ли не они правильно используют вашу библиотеку.
    • Это происходит в силу исключения, возникающего во время выполнения для, как минимум, отладочных сборников. Тип исключения зависит от типа контрактов, которыми вы занимаетесь в вашей библиотеке.
  2. Для разработчиков вашей команды, номер 1 выше также верен. Кроме того, Кодовые контракты могут предоставить вашей команде статический анализ контрактов, с которыми вы обрабатываете свой код.
    • Статический анализ - это предупреждения и информация/события, которые появляются после того, как вы скомпилируете проекты, в которых включен статический анализ.

Как вы знаете, вы можете включить контракты кода для выполнения статического анализа (то есть «времени компиляции») и время выполнения контракта проверка на на проект основы.

Похоже, что вы включили как Выполнение выполнения контракта Проверка и Выполнение статических контракта Проверка на вашем DomainModel проекта.Выполнение проверки статического контракта позволит компилятору информировать вас и вашу команду о потенциальных проблемах с контрактами после выполнения сборки.

Настоящая проблема заключается в том, что вы определили Person в своем модульном тесте. Вы ВключитьПровести проверку статического контракта в вашем модульном тестовом проекте? Если нет, потому что здесь определен Person, статический анализ не будет выполняться в проекте тестирования модуля, если вы его не включите.

Кроме того, так как вы определяете Person в единичном тестовом проекте, также необходимо ВключитьВыполнения выполнения контракта Проверка для отладки строит для модульного тестирования проекта, тоже. Это нежелательно, потому что это приведет к тому, что модульные тесты потребуют гораздо больше времени для компиляции. Я знаю, что вы намерены в конечном итоге переместить реализацию, поскольку вы просто пытались понять, какой код вы уже написали.

Однако, если вам нужно использовать какие-либо тестовые удваивания (например, шпионы), вы можете смягчить необходимость включения этой опции в проект тестирования вашего устройства, указав отдельную сборку, содержащую тест - удваивает ваши требования к модулю и позволяет заключать контракты на этот сборник.

+0

У меня больше нет проекта. Я не могу попробовать и посмотреть, устраняет ли этот ответ проблему. Не могли бы вы создать проект, используя мой код, и сделать снимок экрана предупреждения компилятора после вашего ответа? Мне очень жаль просить вас сделать это. – toddmo

Смежные вопросы