Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

AspectMock — тестируем всякий PHP код

Anna | 31.05.2014 | нет комментариев

Как Зачастую вы пишите велосипеды? Дозволено я тоже здесь рядом пристроюсь? Но дело в том, что мой велосипед, он особый. Казалось бы, простенький, трехколесненький, склепанный каждого за один день. Но есть одна хитрость — он работает на движке от болида. Что он может?

А глядите:

<?php
$class = MySingleton::getInstance();
var_dump($class instanceof MySingleton); // => (bool)true
var_dump($class instanceof DOMDocument); // => (bool)false

// а сейчас немножко магии
test::double('MySingleton', ['getInstance' => new DOMDocument]);

var_dump($class instanceof MySingleton); // => (bool)false
var_dump($class instanceof DOMDocument); // => (bool)true
?>

О нет, мы изменили синглтон! Мы переопределили статический способ. Как же сейчас жить?
Но вопрос сейчас в ином: как мы жили до этого?

Встречайте AspectMock. Самый легкой, но самый сильный фреймворк для моков и стабов на PHP.
Ваш новейший суперпростой помощник в тестировании. Основан на Go AOP от NightTiger.

Выходит, идея AspectMock довольно простая: дозволить тестировать всё то что в PHP ранее считалось «дрянными практиками» по причине неосуществимости тестирования. Статические способы, синглтоны, способы класса — всё это сейчас поддается изменениям в настоящем времени. Дозволено проверить вызов всякого способа. Вот пример:

<?php
class UserService {
    function createUserByName($name)
    {
        $user = new User;
        $user->setName($name);
        $user->save();
    }
}
?>

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

<?php
function testUserCreate()
{
    $user = test::double('User', ['save' => null]));
    $service = new UserService;
    $service->createUserByName('davert');
    $this->assertEquals('davert', $user->getName());
    $user->verifyInvoked('save');
}
?>

Способ save был вызван, но он был заменен пустышкой. Мы довольны, база цела, имя пользователя присвоено. Покрытие 100%, изоляция присутствует.

Для чего это всё?

В PHP сложилась необычная практика считать всякий нетестируемый код плохим. Пример выше показывает, что применение паттерна ActiveRecord продуцирует такой нетестируемый код. Дрянной ли он? Ну выдумка чай. Отличный паттерн, реализован во многих ORM на различных яхыках.

Практика необычная тем, что «тестируемость» кода определяется только техническими ограничениями самого языка PHP.
И потому, раньше чем писать какой либо код, необходимо сразу удерживать в голове: как мы будем это тестировать. И непременно применять Dependency Injection. Непременно.

А сейчас на секундочку давайте предположим, что примерно всякий ООП код на PHP поддается юнит-тестировнию. Может отменнее сосредоточимся на читабельности кода и его результативности, взамен того, Дабы плодить лишние сервисы, инжектить их, а потом создавать на них моки многострочными конструкциями в PHPUnit?

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

AspectMock дозволит вам сосредоточиться на написании результативного кода. Безусловно, вы обязаны соблюдать положительную архитектуру, положительные эталоны, следить за применением зависимостей, но вам огромнее не стоит себя неестественно ограничивать техническими вероятностями PHP. Как говорил один восхитительный человек: «Ничто не правда. Всё позволено.»

Как это работает?

Сам AspectMock дюже легкой: каждого 8 файлов. Там фактически нечего постигать. Но Go AOP, о котором вы теснее могли читать на Прогре, предоставляет чудесную платформу для того, Дабы встраиваться в всякие способы приложения посредством pointcut’ов. На основе наших предпочтений мы можем подменять их своими пустышками, а также регистрировать их выполнение. Go AOP в настоящем времени создает прокси классы и встраивает их в иерархию. Работает посредством метаморфозы автолоадинга. Совместим со всеми знаменитыми фреймворками: Symfony2Zend Framework 2YiiLaravel. Если вы ещё не знакомы с Go Aop, дюже рекомендую с ним поиграться.

Где использовать AspectMock?

Ну верно что не в продакшне. AspectMock сделан экстраординарно для тестирования, он устанавливается через композер и работает в PHPUnit и Codeception. Насколько AspectMock стабилен? Ровно настоль же, насколько и сам Go AOP. Как понимаете, план пока дюже даже экспериментальный. Нынешняя версия 0.1.0. Самое трудное — первичная установка. Испробуйте, если же у вас всё завелось, дальше должен трудиться с пол пинка.

Будут дюже увлекательны ваши отзывы. Спасибо за внимание.

AspectMock обитает на GitHub`е

Какими библиотеками для мокинга вы пользуетесь?

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Проголосовало 35 человек. Воздержалось 12 человек.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB