Dahlem тестване по-лесно с подигравка

Горчивата истина е, че въпреки че основният принцип на тест е съвсем проста, но тя може да бъде доста трудна задача - да го използвате в работата си процес всеки ден. Така Разнообразна жаргон допълнително изостря всички! За щастие има много инструменти, които могат да опростят процеса на тестване. Подигравка, основната рамка за създаване на макет обекти в PHP, е един от тези инструменти!

В тази статия, ние ще считаме, че изобщо от себе си представлява макет обекти, те могат да бъдат полезни и как да се приложи Подигравка в процеса на тестване.

Разследвани с макет обекти

Mock-обект не е нищо повече от просто тест жаргон това означава, че симулация на поведението на реални обекти. Казано по-просто, често по време на тестване, ние не искаме да изпълнява даден метод. Вместо това, ние просто трябва да се уверите, че методът е извикана.

Да разгледаме следния пример. Представете си, че нашият код дърпа метод, който е влязъл във файл. По време на тестването на тази логика, най-вероятно не искате да се докоснете физически файловата система. Тъй като това може значително да забави скоростта на вашите изследвания. В такива ситуации, най-добре е да се направи макет на класа за работа с файловата система, и вместо да се налага ръчно да прочете файл и да се уверите, че той е бил актуализиран, ние трябва да проверите, че правилният метод в този клас се нарича. Това е създаването на макет обект! Този термин не е нищо само по себе си не съдържа. Просто се симулира поведението на други обекти.

Не забравяйте, жаргон - това е просто жаргон. След като не позволявайте на объркващата терминология ви извадят от начина на усвояване на нови умения.

Особено с развитието на процеса на проектиране - включително и когато започне да се прилага принципът на цялата отговорност и да използва зависимостта инжекция - запознаване с моделната обект бързо ще се превърне в незаменим.

Осмива срещу стълбове. най-вероятно ще бъдат по-склонни да отговорят на термини като макет и все още мъниче. често един с друг, те ще бъдат заменени. Всъщност, и двете от тях се използват за различни цели. Първият е свързан с по-дългосрочен процес на определяне на очакване и проверка изисква поведение. С други думи, макет обект може потенциално да доведе до изпитване на падане. От друга страна, все още мъниче обект - това е просто набор от данни под формата на кочан, която може просто да мине да отговарят на определени изисквания.

Тест библиотека де факто стандарт за PHP - PHPUnit идва със собствен API за създаване на макети на обекти, които, обаче, може да бъде доста тромава за използване. Както вероятно да имат време да се уверите, че толкова по-трудно ще бъде тествана, толкова по-вероятно, че възложителят просто няма да правя.

За щастие, има голям брой решения на трети страни, достъпни чрез Packagist (пакет хранилище за Композитор), която ще се подобри яснотата на тестовете, както и да се опрости самото писане им. И може би най-важните от тези решения е рамка Подигравка библиотека за създаване на макет обекти.

Библиотеката е създадена като алтернатива за тези, които са уморени от прекалено претоварен синтаксис на PHPUnit и е много прост, но мощен. Както скоро ще откриете, библиотеката се превърна в стандарт в индустрията на съвременното развитие на PHP.

Dahlem тестване по-лесно с подигравка

Подобно на много други съвременни PHP инструменти, Подигравка може да се инсталира чрез Composer.

Подобно на повечето PHP инструменти тези дни се препоръчва да инсталирате Подигравка библиотека през Composer.

Така че, хей, какво друго за Composer. Сега е предпочитан в диспечера на PHP общността зависимост. Тя осигурява прост метод за определяне на зависимостите на проекта, както и способността да ги настроите с една единствена команда. Като съвременна PHP-разработчик, че е важно, че имате основни познания за композитора е и как да го използвате.

Преди това той никога не е използван, за да добавите ново обучение composer.json файл в празен проект и да го напълни с следното:

Първата част определя JSON, че развитието трябва Подигравка библиотека. От командния ред изпълнете команда композитор инсталирате --dev и изтегляне на библиотеката.

И като допълнителен бонус Композитор идва със собствен Autoloader. Или посочите списък с директории в classmap и изпълнява композитор самосвални автоматично зареждане или просто да следват стандартната PSR-0, а само следи за спазването на структурата на папките. Отидете тук. за да научите повече. Ако все още имате да свържете ръчно неограничен брой файлове във всеки един от вашия PHP файл, е вероятно, че имате нещо нередно прави.

Cleduya принцип цялата отговорност, която изисква всеки клас имаше само една причина да се промени. ние трябва да се разделим нашата логика между два класа: един за генериране на подходящо съдържание, а от друга - да се записва физически данни във файл. За това ние трябва класове Generator и файла.

Съвет: защо да не използвате file_put_contents точно в класа на генератора. Добре, но първо си задайте въпроса: "Как ще тества аз?" Има различни техники, които позволяват приоритет спрямо неща, но това е добра практика да се направи обвивка вместо тази функционалност, така че можете лесно да го замени, например чрез Подигравка!

Тук е основната структура (с малка част от псевдо-код) на нашия клас генератор.

инжектиране на зависимостта

Този код се използва това, което наричаме инжекция зависимост. И още веднъж, това е просто жаргон програмисти, за да вмъкнете клас зависимости чрез конструктор, вместо техния твърд код в кода.

Защо е печеливш? Защото в противен случай ние няма да можем да се замени клас файл. Разбира се, ние може да направи тапа за клас на файла. но ако се инициализира твърдо кодирана в класа по който изпитваме, няма да има начин да се замени обект все още мъниче.

Най-добрият начин да се създаде лесен Applications- го тест преди всяко извикване на метод, задайте си въпроса: "Как мога да получа този тест?" Въпреки че има и методи за тестване на зависимостта zahardkodennyh, но тяхното използване се смята за лоша форма. Вместо това, тя винаги е по-добре да се вгради в зависимост от строителя или чрез инкубатора.

Инжектиране създателите чрез повече или по-малко идентичен на инжектиране чрез конструктор. Точно същия принцип, като единствената разлика е в това, че връзката не е построен през метода на конструктор и сетер:

Сега, ако класът обект на файла ще бъде предавана на строителя, а след това той ще се използва в класната стая. От друга страна, ако нищо не се е бил прехвърлен, самата класа Generator инициализира класа, която искате. Това ви позволява да направите тези промени, като например:

Ние ще продължим нататък, и за целите на тази статия, ние ще направим клас файла нищо повече от проста обвивка на PHP функция file_put_contents.

Не е ли просто? Нека да напише тест, за да видим какво е проблемът.

Имайте предвид, че тези примери се предполага, че редовните лекции, автоматично се зарежда с помощта на Composer. В него, можете по избор да зададете composer.json обект автоматично зареждане. в който можете да декларира всяка директория или класове, която искате да изтеглите автоматично. Не по-обемисти изисква изрази!

Стартирай сега PHPUnit. което ще се върне следното:

Грийн. Това означава, че можем да преминем към следващата задача, нали? Е, не съвсем. Въпреки че в действителност на код и се изпълняват, но всеки път, когато стартирате нашите тестове, файловата система ще създаде файл foo.txt. И това, което се случва, когато има десетки тестове? Лесно е да си представим, че много бързо скоростта на вашите изследвания ще пострада.

Dahlem тестване по-лесно с подигравка

Въпреки че тестовете и бяха успешни, но те са засегнати от файловата система.

Надявам се, че предишния раздел даде изчерпателен обяснение защо е необходимо да се подиграват-обекти. Както споменах по-рано, въпреки че можем да използваме родния API на на PHPUnit, но това не е най-подходящо да се използва. За да се докаже това, ето един пример за проверка на това дали моделната обект получава метод на разговор getName и връща John Doe.

Сега добавете състояние чек, който метод getName ще се нарича само веднъж и да се върне на Иван Петров - прилагане на PHPUnit изглежда твърде тромава. С Подигравка ние може значително да подобри яснотата.

Забележете как предишния пример в момента е много по-лесно да се чете.

Продължаване на пример от предишния раздел, "Дилемата", този път в GeneratorTest клас. нека да се направи макет обект и се симулира поведението на файла клас, използвайки Подигравка библиотека. Тук е актуализиран код:

Обърква ти се обадя Подигравка :: близо () в метода демонтиране. Тази статична повикване изчиства Подигравка контейнер, който се използва при тестовете, и да изпълнява всички задачи за проверка на вашите твърдения.

Можете да получите макет обект клас, използвайки метод Подигравка :: макет (). обикновено трябва да укажете кои методи този обект, ние очакваме, че ще се нарича, заедно с всички необходими аргументи. Това може да стане като се използват методи shouldReceive (МЕТОД) и с (ARG).

В този случай, когато ние наричаме $ generate-> огън (). след като проверим, че ще се нарича по инициатива на метод сложи файл. които ще бъдат прехвърлени към пътя на файла и foo.txt Foo бар данни.

Тъй като ние сме с помощта на зависимостта инжекция, но сега ние използва приставка вместо реален обект на файла.

Ако изпълнете тестовете отново, те отново ще бъде зелен, но класата на файла и, съответно, на файла самата система не са били замесени. Тъй като не е необходимо да се обадите на клас файл. То трябва да бъде собствените си тестове! Zakglushki направите, за да спечелите!

Прости Макети Objects

Макети обекти не трябва винаги да разчитате на всеки клас. Ако имате нужда от само един прост предмет, например даден потребител, можете просто да мине масив мнима метод - когато ще се създаде ключ-стойност чифт с подходящи средства, които ще се върнат на съответната стойност.

Върнатата стойност от Zakomannyh Методи

Той със сигурност ще бъде ситуация, в която нуждата от zamokannogo метод клас, за да върне стойност. Продължавайки нашия пример от класовете Generator / файл, че ако трябва да се уверите, че ако файлът вече съществува, той няма да бъде презаписан? Как можем да се приложи?

Решението на това е да се използва метода на andReturn zamokannogo обект да симулират различни състояния. Тук е актуализиран пример:

Този актуализиран код сега проверки, че съществува, ще бъдат извикани на zamokannogo клас файла. и за целите на теста, той ще трябва да се върне вярно. като по този начин показва, че файлът вече съществува и не трябва да бъде презаписан. След това обръщаме внимание на това, че в такива ситуации това, методът на пробва класа на файла няма да се обади. Гаврата е лесно да се направи с никога (метод).

Ние би трябвало да работи на тестовете отново и грешката ще бъде върната:

Аха! тест очаква метод $ това-> File-> съществува () се нарича. но никога не се случва. И така, тестът е неуспешен. Отстраняване на този!

Това е всичко, което трябва да се направи! Въпреки, че ние не следвахме цикъла на развитие чрез тестване (TDD), но нашите тестове над зеленото!

Важно е да се помни, че този стил на изпитване е в сила, ако сте тестване, както и в зависимост от вашата класа! В противен случай, въпреки факта, че тестът е зелен, по линията на сървъра код може да се счупи. Нашата демонстрация проверява само, че класът на генератор работи както се очаква. Не забравяйте да тествате класа и файл!

Може да има случаи, в които са необходими допълнителни ограничения. Както беше показано, те могат да бъдат полезни в случаите, когато трябва да се провери, че е причинена от специфичен метод с необходимите аргументи. Важно е да се запомни, които чакат да бъде вярно, ако методът се нарича с тези аргументи.

Ето няколко примера.

Този пример може да се удължи още повече и да направи аргументите динамичен. Например, ние трябва да се провери дали низът е приет на метода:

Или аргумент е необходимо да се консултирате с регулярен израз. Уверете се, че името на файла завършва с .txt.

Е, в последния пример, което позволява използването на набор от наличните стойности за аргумента, използвайки anyOf.

В този пример, очакването, би било вярно само ако аргумент на метода на получите, ще има стойност log.txt или cache.txt. Подигравка в противен случай се хвърли изключение по време на изпълнение на тестове.

Съвет: Не забравяйте, че винаги можете да зададете псевдоним на подигравките. например т. да направят кода по-lokanichnym: използвайте Подигравка като м; Сега е възможно да се използва структура lakonchinye: m: макет ().

И най-накрая имаме много начини да посочват, че методът трябва да се върне zamokanny. Например, ние трябва да се върнем булева стойност. лесно:

частичен Moki

Може да има ситуации, когато трябва да се направи тапа само за един единствен метод, а не целия сайт като цяло. Да предположим, че за целите на нашия пример, методът в нашия клас се отнася до глобалната функция, за да получите стойността от конфигурацията на файла.

Въпреки че има различни техники, за да направи още мъниче на глобалните функции. Но все пак, това е по-добре да не се налага на този метод. Тя е в такива моменти идват на помощ на частичния Moki.

Забележете как дадохме в скоби името на метода, който искате zamokat. Ако има няколко метода, просто разделете ги със запетаи:

Алтернативен начин за използване на частичен mokov може би посочва zamokannogo обект подразбиране, когато всички методи се отнасят към класа родител, а за тях няма да се даде никакви очаквания.

Предишният код, който може да бъде пренаписана, както следва:

В този пример, всички методи на MyClass ще действат така, както обикновено, с изключение на getOption на метод. бъде променян и ще се върне 10 000.

Dahlem тестване по-лесно с подигравка

Hamcrest библиотека осигурява допълнителен набор от тестове за определяне на очаквания.

След като сте усвоили подигравка API, така че е препоръчително да се започне използването Hamcrest библиотека, която осигурява допълнителен набор от конструкции за определяне на добри очаквания за четене. Както Подигравка, тя може да се инсталира чрез Composer.

Веднъж инсталиран, можете да започнете да използвате дизайна по-четлив във вашите изследвания. Ето няколко примера, включително незначителни промени за постигане на един резултат.

Забележете как Hamcrest ви позволява да записвате вашата проверка, така че те да отразяват възможно най-много на вашите очаквания. Използване на функцията е () е синтактична захар за по-добра четливост.

Скоро ще разберете, че Подигравка брои заедно с Hamcrest достатъчно добър. Например, ако използвате само Подигравка, а след това да се запише, че zamokanny метод трябва да се нарича само с един аргумент от тип низ. процедира, както следва:

Използвайки същия Hamcrest, Подигравка :: тип структура може да бъде заменен от stringValue (), както следва:

Hamcrest позволява resourceValue -soglashenie за сравнение на типа стойност.

Алтернатива за Подигравка :: всяко () При проверката за всеки аргумент може да бъде всичко ().

заключение

Най-голямата пречка за Подигравка, не е самостоятелно API.

И разбиране на защо и кога да се използва Moki във вашите изследвания.

клас на файла ние сме ангажирани в взаимодействие с файловата система. MysqlDb хранилище съхранява данните. Class E-mail занимава с изпращане на имейли. Имайте предвид, че нито един от тези примери не използвайте думи и.

След като разберете това, процесът на тестване ще бъде много по-лесно. За всички операции, които не попадат под сянката на този клас, трябва да използвате зависимостта инжекция. При тестване, важно е да се съсредоточи върху един клас, и zamokat всички необходими зависимости. Вие не трябва да се тества всички от тях за останалите класове трябва да бъде собствените си тестове!

Макар че нищо не може да ви позволи да използвате родния изпълнението на създаване mokov в PHPUnit, но по някаква причина ние не използваме много по-разбираеми и лесни за ползване версия на Подигравка?