• Как правильно проводить функциональное тестирование Laravel?

    @sdo
    Всё ли и правильно ли я проверяю?


    Попробуйте поковырять покрытие кода тестами и частично это будет ответом на вопрос "Всё ли". А вот насчет правильно - ответить может только тот, кто наработал шишки в энтом проекте и понимает, какую часть головы следует от падающих шишек прикрывать тестами, а какую - оставить чтобы было видно куда идти )

    Если где-то при передаче данных во view возникнет ошибка (не найдется что-то из бд), будет ли и тут ошибка?


    Опять-таки зависит от реализации. Если при ошибке будет не 200-статус, то тест ее выявит. Другое дело, что неудобно понимать - при проваленном тесте статуса - что именно стряслось, поэтому я заколхозил себе метод, который сначала проверяет статус условием, если actual_status не равен expected_status - то выводит в консоль и тело response, а уж потом assert и валится как полагается.

    Еще вопрос, есть ли способ залогинить пользователя сразу на весь класс теста чтобы не прописывать каждый раз login?


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

    Всё, что я продемонстрировал это ведь вся суть функциональных тестов?

    Не возьмусь отвечать, но кто требует от вас всю суть? Некоторые аспекты тестов раскрываются только зайдя поглубже в лес..
    Ответ написан
    Комментировать
  • Почему не виден(undefined) массив объектов в методе?

    @sdo
    Кажется вот здесь нужная вам обработка

    Вам правильно говорили в предыдущем решении - код поделен на несколько контекстов исполнения. То, что доступно в одном контексте, не видно в другом. Решение - либо пробрасывать необходимый вам объект в контекст после завершения get явно (но я не знаю можно ли и как это сделать в ангуляре, надо тестить на простых примерах сначала, я с ангуляром не работал), либо делать запросы асинхронными, так чтобы явно ждать когда каждый исполнится по очереди, и последовательно обрабатывать их результаты - тогда будет один последовательный контекст исполнения. Последний вариант работает понятнее, но дольше. Первый подразумевает что массив может некоторое время быть в подвешенном состоянии - половина запросов исполнилась и проставила доп. инфу в соответствующие объекты, а половина еще в процессе получения данных. В тоже время (так как контекстов исполнения несколько, и они работают одновременно) "главный" контекст, которому и нужен был массив с заполненными данными, также теоретически может попытаться начать работу с этим массивом, поэтому его нужно как-то ограничивать или проверять все ли запросы завершены.
    Ответ написан
    Комментировать
  • Как добавить к массиву объектов новый ключ-значение?

    @sdo
    ну самое простое (не вижу у вас в коде $ а других библиотек не знаю, может у вас там есть map) это (также не вкурил, к какому именно объекту.. и в чем сложность вопроса?)
    for(var i=0;i<MyObject.response.length;i++){
        MyObject.response[i]['formatted_address ']= $scope.mapAdd.results[0].formatted_address;
    }


    У меня четкое ощущение что я не понимаю, а задача сложнее.
    Ответ написан
    4 комментария
  • Зачем в PHP ссылки?

    @sdo
    Мы обычно используем ссылки, чтобы вернуть из функции "несколько" результатов. Лучше один раз увидеть. Предположим, мы пишем функцию для запроса данных к БД. Начнем с простого:
    function query($sql){
     ...
      return $data;
    }

    Вызов:
    print_r ( query("Select * from test" ) );

    Вроде ниче так, пока в таблице есть записи - мы знаем что если из функции что-то вернулось - запрос состоялся. А если пусто - это нет данных или произошла ошибка? Получается, возвращать надо TRUE (запрос состоялся)/FALSE, ну а то что нет данных - это еще не ошибка.. И тогда мы стали делать так (передавать из функции $data по ссылке):
    function query($sql, &$data){
     ...
      return $result;
    }
    // это позволяет вызывать запросы следующим образом:
    if ( query('select * from test', $data) ){
        // проверка и обработка $data
    }
    else{
    // обработка ошибки
    }
    Ответ написан
    1 комментарий
  • Что исправить в скрипте?

    @sdo
    Понимаю, что изврат, но как рак на безрыбье..
    Рег честно стырен с просторов интернета, рекомендую в нем подкрутить обязательность протокола http:// и еще не начинать статей со ссылок - ucfirst честно сделает Вам Http://
    function TCR_CL_replace_content($content)
    {
    	$regex = "/(\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|])/i";
    	$content=preg_replace_callback( $regex , function($m){return str_replace('.',chr(0),$m[1]);} , $content);
    	$content=preg_replace_callback( '|(?:\.)(?:\s*)(\w{1})|Ui'
    		,function($matches){ return ". ".strtoupper($matches[1]);}
    		,ucfirst($content)
    		); 
    	$content= str_replace(chr(0),'.',$content);
    	return $content;
    }


    Считаю необходимым дополнить один момент. Надо учитывать кодировку исходного текста. Для utf8 например, скрипт будет работать некорректно. Для работы с utf-8 необходимо будет добавить модификатор u в вашу регулярку, добавить mb_internal_encoding и заменить strtoupper на mb_strtoupper. Также следует вычислять символ для временной подстановки динамически, на основании факта что его нет в исходном контенте.
    Ответ написан
    Комментировать
  • Как тестировать методы которые используют сторонние данные?

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