• Чем mock отличается от stub в phunit?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    https://vc.ru/flood/44925-za-chto-ya-cenyu-testiro...

    Главное различие между stubs и mocks заключается в том, что в одном случае мы управляем состоянием, а в другом - поведением.

    Когда мы используем mocks, мы заменяем весь модуль на mock (ложный, тестовый объект, имитирующий настоящий). А stub - это функция, которая всегда выводит один и тот же результат, вне зависимости от того, что было подано на вход. Mocks используют для того, чтобы проверить, была ли функция вызвана с правильными аргументами, а stubs, чтобы протестировать, как функция работает с полученным ответом. Стабы нужны для проверки состояния метода, а моки используются для регулировки поведения.
    Ответ написан
    Комментировать
  • Как избавиться от ERR_TOO_MANY_REDIRECTS при переносе сайта с HTTP на HTTPS на Wordpress?

    Punkie
    @Punkie
    Была точно такая же проблема у меня.

    Добавьте в wp-config.php в самое начало (после <?php ):

    $_SERVER['HTTPS'] = 'on';

    Плюс пониже после define всяких (до текста "/* Это всё, дальше не редактируем. Успехов! */"):

    define('FORCE_SSL_ADMIN', true);
    define('FORCE_SSL_LOGIN', true);
    if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
           $_SERVER['HTTPS']='on';


    Если будут проблемы с путями у картинок, поставьте этот плагин:
    https://wordpress.org/plugins/velvet-blues-update-urls/

    И замените http://ваш_домен на https://ваш_домен с его помощью
    Ответ написан
    14 комментариев
  • Выбор монитора для программиста, как правильно?

    orlov0562
    @orlov0562
    I'm cool!
    Как написали бери 2x24", единственное что могу добавить бери формат 16:10 (а не 16:9) и желательно с возможностью поворота на 90 градусов. У меня 2 x HP ZR24W, уже лет 5 или 6, ничего менять не хочу.

    hpzr24w_large4.jpg
    Ответ написан
    11 комментариев
  • Есть отличные примеры создание бота telegram на php?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Абсолютно все что нужно для написания Telegram бота находится на странице https://core.telegram.org/bots/api
    У бота абсолютно тривиальный протокол, json в определенном формате шлется POST запросом по HTTPS.
    Соответственно реализация от языка по факту не зависит, можно хоть на bash скриптах сделать.
    Ответ написан
    Комментировать
  • Где найти самое простое объяснение Dependency Injection паттерна?

    iximiuz
    @iximiuz
    Мартин Фаулер круто пишет обо всех паттернах. Про DI можно почитать тут. Вообще у него отличный блог. И он же автор книги P of EAA. Правда русский ее перевод крайне не рекомендую читать, можно только запутаться, так что читайте в оригинале.

    Если хотите разобраться с паттернами, то самая простая (и при этом дельная!) книга - это Фриман&Фриман. Ее можно читать и на русском.

    Применительно к PHP - вот лучшая книга про шаблоны (и не только), которую я видел PHP. Объекты, шаблоны и методики программирования от Мэт Зандстра.

    Порядок прочтения рекомендую следующий: Фриман&Фриман, затем Мэт Зандстра, и на десерт Фаулера P of EAA.

    UPD:
    Важно отличать паттерн Dependency Injection от Dependency Injection Container.
    Простейший пример внедрения зависимости:
    interface IEngine {}
     
    class V8Engine implements IEngine {}
     
    class Car {
      public function __constructor(IEngine $engine) {
        $this->engine = $engine;
      }
    }
     
    $car = new Car(new V8Engine());

    Простейший пример игнорирования явного внедрения (для такого кода трудно писать unit-тесты, его труднее понимать и править):
    class V8Engine {}
    
    class Car {
      public function __constructor() {
        $this->engine = new V8Engine();
      }
    }
    
    $car = new Car();

    Отличный (и легковесный) пример DIC - это pimple:
    // define some services
    $container['session_storage'] = function ($c) {
        return new SessionStorage('SESSION_ID');
    };
    
    $container['session'] = function ($c) {
        return new Session($c['session_storage']);
    };

    Советую прочитать и понять его исходники, чтобы убедиться, что в DIC (во всяком случае для PHP) нет никакой магии. Первая версия была всего ~100 строк. Необходимо также отметить, что класс Session использует шаблон Dependency Injection, явно определяя свою зависимость от SessionStorage. А контейнер делает лишь правильную связку.

    И да, контейнер сам по себе можно использовать как service locator, если к нему, например, есть глобальный доступ. Но это очень плохая практика, потому что если что-то обращается к сервис локатору, то формально оно начинает зависеть сразу от всех компонентов системы.
    Ответ написан
    4 комментария