
Sergey
27.11.2016
15:40:27
https://3v4l.org/cik4l

Serghei
27.11.2016
17:17:41
Есть тест для логера. Логер что-то там пишет в файл.
Иногда тесты валятся потому что в логе
[Sun, 27 Nov 16 17:03:46 +0000][DEBUG] Hello
а мы ожидаем
[Sun, 27 Nov 16 17:03:45 +0000][DEBUG] Hello
не всегда такое, но бывает. учитывая факт что тестов становится все больше и больше, тестовый енв становится все тормознутей, предполагаю что подобные фейлы будут проявляться чаще; да и оно может случатся когда лог пишется на границе секунд например.
подкиньте идею, какой нибудь не заморочливый способ тестировать это дело. я в том плане чтоб тест не превратился по сложности в трудно понятный код.
$logger->log($level, 'Hello');
$logger->close();
$I->amInPath($this->logPath);
$I->openFile($fileName);
$expected = sprintf(
"[%s][%s] Hello",
date('D, d M y H:i:s O'),
$name
);
$I->seeInThisFile($expected); // фейлится тут

Sergey
27.11.2016
17:19:55
> подкиньте идею, какой нибудь не заморочливый способ тестировать это дело
регуляркой?
вместо строк

Google

Serghei
27.11.2016
17:20:10
как вариант да, думал

Sergey
27.11.2016
17:20:23
ну что бы не завязываться на конкретных данных зависящих от времени
а прочерять что-то типа

Serghei
27.11.2016
17:20:45
если ничего не придумаю - буду регуляркой

Sergey
27.11.2016
17:21:00
а что тут еще можно придумать? мокать время? так себе идея
[TIMESTAMP][DEBUG] Hello
а потом тупо preg_quote + str_replace

Serghei
27.11.2016
17:22:24
угу

Sergey
27.11.2016
17:22:29
что бы было красивенько
еще клевая штука
интеграционные тесты которые проверяют что мы вообще умеем писать в файл правильно
и юнит тесты которые проверяют что именно мы пишем
это было бы грамотнее

Google

Sergey
27.11.2016
17:23:45
в интеграционных тестах проверять тупо наличие строк, а не их содержимое
$writer->write(sprintf('[%s][%s] %s'), $timestamp, $level, $message));
и в юнит тестах мокать $writer
а интеграционными покрывать что он вообще может писать

Aleh
27.11.2016
17:24:52
хз, насколько это оправданно. Если будет интеграционный тест, который для данного модуля протестит, что файл записался и записалось то, что нужно, то норм
в случаях с фс они выглядят одинаково сложно

Serghei
27.11.2016
17:25:03
да, все никак не соберусь это дело разделить. там частично намешано конечно интеграционных и юнит. но тестов > 1k и так-то они рабочие, просто не православные ) по этому я на них смотрю, вздыхаю, и откладываю эту идею на потом

Sergey
27.11.2016
17:25:30
> в случаях с фс они выглядят одинаково сложно
интеграционным тестам райтера нужно проверить только то, в каком порядке чего записалось, не затерлось ли, проверить стримы и т.д
ну и отдельный бонус - можно потом будет делать отдельные райтеры
например в syslog
а не в файл
или в memry stream
хотя хер его знает
я логгеры никогда не писал)

Aleh
27.11.2016
17:26:17
я понимаю про что ты, DIP там, все дела
абстрактные врайтеры

Sergey
27.11.2016
17:26:34
скорее SRP и сегрегация интерфейсов

Serghei
27.11.2016
17:26:37
нада в монолог посомотреть еще
как ребята тестируют

Sergey
27.11.2016
17:27:08
у них писатели отдельно и форматтеры отдельно

Google

Sergey
27.11.2016
17:27:10
насколько я помню

Aleh
27.11.2016
17:27:13

Sergey
27.11.2016
17:27:22
S
S - Про то, как делить на части исходя из возможных изменений
O - Про то, как расширять функционал не внося изменений в код
L - Про то, как грамотно строить абстракции и предотвращать несовместимые интерфейсы
I - Про то, как уменьшить связанность и добиться тотального контроля за тем, кто что юзает и кому что на самом деле надо
D - Про то, как обезапасить одни модули от изменений в других модулях
в общем и целом SOLID это про protected variations из GRASP
или как сделать так что бы "работает не трогай, особенно если на это что-то завязан кто-то другой"

Serghei
27.11.2016
17:31:25
форматеры и у меня отдельно
думаю да, самым правильным будет переписать тесты на интеграционные и юнит
спасибо Серый

Fayozjon [CybernatiC]
27.11.2016
17:34:13
Мне кажется или вы работаете в телеграме? Постоянно онлайн :)
@fes0r особенно

Fayozjon [CybernatiC]
27.11.2016
17:34:33
:)

Sergey
27.11.2016
17:34:40
достаточно просто не выключать ноут
и ты всегда будешь онлайн
с телефоном еще проще

Fayozjon [CybernatiC]
27.11.2016
17:35:01
:)

Sergey
27.11.2016
17:36:21
воскресенье ж

Fayozjon [CybernatiC]
27.11.2016
17:37:25
Как давно у вас отключали электричество ?
Сорри что оффтоп

Google

Sergey
27.11.2016
17:37:54
настолько татально что не можешь уже телефон зарядить?
хм...
вот если прям сейчас у меня вырубят свет
ноут проживет еще часоов 7-8

Fayozjon [CybernatiC]
27.11.2016
17:38:33
У меня уже ноут тютю

Sergey
27.11.2016
17:38:38
телефон можно подключить и тоже чутка подзарядить

Fayozjon [CybernatiC]
27.11.2016
17:38:48
:)

Sergey
27.11.2016
17:38:57
а еще... могу пожервтвовать батареей электронки и ими заряжать телефон
и прожить так еще часиков 8

Serghei
27.11.2016
17:47:32
power bank же

Admin
ERROR: S client not available

Sergey
27.11.2016
21:40:07
вот все знают что null это плохо и вместо
$user = $this->userRepository->find(1);
if(null === $user){
....
}
должно быть
try{
$user = $this->userRepository->find(1);
}catch($e){...}
но мне одному кажется что это как-то некрасиво чтоли выходит?)

Sergey
27.11.2016
21:57:17
я делаю так
```
interface UserRepository
{
public function get(int $user): User;
public function find(int $user): ?User;
}
хотя сейчас задумался
мне find по сути нужен сейчас в основном что бы кинуть "другое" исключение
хм....
хм........
ну да
try catch норм

Google

Sergey
27.11.2016
22:01:08
try {
$user = $users->get(42);
} catch (UserNotFoundException $e) {
$user = null;
}
пожалуй перестану делать нулабл методы в репозиториях
пока за минуту не нагенерю "зачем"

Serghei
27.11.2016
22:13:43
а у тебя есть UserRepository::has ?

Aleh
27.11.2016
22:14:28
уверен, что если нужен
то есть)

Serghei
27.11.2016
22:15:05
тогда find ?User не нужен

Aleh
27.11.2016
22:16:24
не думаю, что это так вот прямо связано

Serghei
27.11.2016
22:17:13
думаю что репозиторий это коллекция, которой find не нужен если есть has

Aleh
27.11.2016
22:18:51
вот ща совсем не понял

Serghei
27.11.2016
22:19:40
http://shawnmc.cool/the-repository-pattern
ну например

Aleh
27.11.2016
22:20:10
ну я знаю, что такое репозиторий, лол)
у репозитория(коллекции) не может быть метода save

Serghei
27.11.2016
22:20:51
может
ты заголовок наверное прочел и закрыл

Aleh
27.11.2016
22:21:25
нет, полистал еще
ну вот в конце он чето про add написал
короче как has может избавить от find?

Serghei
27.11.2016
22:23:00
я к тому что у любой коллекции есть метод поиска
если есть has то использовать find просто чтоб поискать излишне

Aleh
27.11.2016
22:23:45
эм
что делает has, а то я кажется совсем перестаю понимать