Верифікація в додатку обміну валют в Visual C # (Sharp)

Для виконання тестового класу TestcurrencyTrader застосовується наступний код: TestCurrencyTrader els = new TestCurrencyTrader () elsIntializeExchangeRate ()

У модифікованому тестовому коді створюється екземпляр класу Testcur-rencyTester, після чого викликається метод InitializeExchangeRate () Але являея Чи даний код тестом Адже метод InitializeExchangeRate () Не вертає значення і не має вихідного параметра Такий тест можна порівняти з відправлено листа поштою Хоча, швидше за все, лист дійде до адресата, повної увенності в цьому немає Використання тестів, про успішне завершення яких можна судити тільки з певною ймовірністю, є дуже поганою ідеєю

Нам необхідно перемістити верифікаційний код з процедури тестування в клас TestCurrencyTrader наступним чином:

class TestCurrencyTrader : CurrencyTrader { public void InitializeExchangeRate() {

ExchangeRate = 1000

if (ExchangeRate = 1000) {

throw new Exception(&quot1000 verification failed&quot)

}

}

}

Код для верифікації, що змінної ExchangeRate було присвоєно те ж саме значення, яке було повернуто, виділений жирним шрифтом

ПРИМІТКА

Застосовувані нами тести стають все більш складними, і ви можете задатися вріс: Навіщо робити це таким чином” Для цілей даної книги ми пишемо тести і створюємо нашу власну інфраструктуру тестування Зазвичай ми б цього не зробили, а скористалися б для створення тестів готовою інфраструктурою тестіранія, наприклад NUnit (http://wwwnunitorg), або інструментами, що входять до складу Microsoft Visual Studio Professional Але тут я хочу продемонструвати, як іспользать не інструмент тестування, а мова С # У процесі вивчення написання тестів з самого початку ви зрозумієте, що можна чекати від інфраструктур тестування

Використання умовних операторів

Розміщення верифікаційного коду в класі є прийнятним в контексті тестового класу TestCurrencyTrader Але все ще залишається проблема тестіруемті класів, які не надають свій стан

Щоб зрозуміти цю проблему, давайте повернемося до коду для попереднього погрева духовки Уявіть собі, що ми переписали клас oven, включивши в нього верифікаційний тест, таким чином:

class Oven {

private int _temperature

public void SetTemperature(int temperature) {

_temperature = temperature

if (_tenperature = 1000) {

throw new Exception(&quot1000 verification failed&quot)

}

}

public bool AreYouPreHeated() {

/ / Перевіряємо, чи відповідає температура необхідної, return false

}

}

Жирним шрифтом виділено код, великою мірою, для такої ж верифікації, як і верифікація в класі CurrencyTrader, яка перевіряє параметр temperature на відповідність певному значенню У той час як дана перевірка корисна для конкретного тесту, у великому плані вона марна У його теперішньому вигляді тестовий код допускає єдине дійсне значення параметра temperature-юоо будь-яке інше значенні згенерує виняток Таке рение явно не є прийнятним

Дану проблему можна вирішити за допомогою умовних операторів Умовні опатори – Це спеціальні ключові слова, за допомогою яких розробник може визначити, скомпилірувався чи певний фрагмент вихідного коду Далі наводиться приклад вихідного коду, що містить умовні оператори:

class TestCurrencyTrader : CurrencyTrader { public void InitializeExchangeRate() {

ExchangeRate = 1000

#if XNTEGRATE TESTS

if (ExchangeRate = 1000) {

throw new Exception(&quot1000 verification failed&quot)

}

#endif

}

}

Умовний оператор завжди починається з символу #, за яким відразу ж, без пріла, йде ключове слово, в даному випадку ключове слово if Код, укладений

між операторами # if і # endif, компілюється при дотриманні певної умови Оператори цього типу називаютьсядирективами препроцесора (Preprocessor directive) У даному прикладі умовою компіляції коду, укладена в блок # if / # endi £, є значення true ідентифікатора INTEGRATE_TESTS

Компіляційного ідентифікатори, як INTEGRATE_TESTS, Можна визначити в иодную коді або в використовуваної вами інтегрованої середовищі розробки У Visual С # Express ідентифікатор INTEGRATE_TESTS можна визначити наступним чином:

1 Клацніть правою кнопкою миші назву проекту та виберіть пункт меню

Properties

2 Відкрийте вкладку Build

3 Введіть еINTEGRATE_TESTS В текстово е пів еConditional  Compilation Symbols

Верифікація з використанням часткових класів

Умовна компіляція доводиться до речі, коли, залежно від конфігурації, потрібно включити або виключити код Але деякі програмісти недолюблюють включати умовно компільований код у функції, т к такий код дуже важко сровождать Іншим рішенням буде застосувати ключове слово partial class спільно з операторами умовної компіляції

Досі у всіх прикладах при визначенні класу всі його методи та інші елемеи оголошувалися в одному місці – між фігурними дужками коду класу За допомогою часткових класів різні елементи класу можна оголошувати в різних місцях При компіляції окремі фрагменти класу будуть зібрані в одне ціле визначення класу Для нашого тестового коду ми можемо створити частковий клас для реалізації тесту і умовно компільованих тестову реалізацію часткового класу Далі при-

водиться модифікування й код клас а TestCurrencyTrader, якому йМожна Про викорис-

зовать для тестування стану без надання його зовнішньому кодом:

partial class TestCurrencyTrader : CurrencyTrader { public void InitializeExchangeRate() {

ExchangeRate = 1000

}

}

#if XNTEGRATE„TESTS

partial class TestCurrencyTrader : CurrencyTrader { public void VerifyExchangeRate(double value)  {

if (ExchangeRate = value) {

throw new Exception(&quotExchangeRate verification failed&quot)

}

}

}

#endif

У даному оголошенні класу ключовим словом class передує ключове слово partial Перша реалізація класу Testcurrencyrrader демонструє приклад, коли стан не надається зовнішнім кодом Друга реалізація класу TestcurrencyTrader, яка оголошена в контексті блоку умовної компіляції, містить метод verifyExchangeRate () Цей верифікаційний метод тестує властивість ExchangeRate на наявність певного значення

ПРИМІТКА

Часткові класи можна застосовувати тільки у контексті однієї збірки У даному коексте збірка означає скомпільовані фрагменти вихідного коду NET, рассмоенние в розділі 1 Іншими словами, якщо ви визначите частковий клас в бібліотеці класу, тоді всі фрагменти даного часткового класу потрібно визначити в цій же бібліотеці класу

За допомогою часткових класів можна з легкістю розбити функціональність на окремі файли вихідного коду таким чином, модифікація, вихідного коду в одному файлі не торкнеться вихідний код в іншому файлі У даному прикладі донстріруется використання часткових класів для маніпулювання внутрішнім станом класу без порушення при цьому правила, що забороняє надана внутрішнього стану Часткові класи також застосовуються в генераторах коду, де один файл вихідного коду містить спеціальний код, а інший містить генератор коду

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*