Как стать автором
Обновить

Комментарии 6

> Для PHP есть несколько готовых фреймворков, например Humbug и Infection. К сожалению, нам они не подошли, потому что несовместимы с SoftMocks.

А можно, пожалуйста, поподробнее? Почему они не совместимы? Казалось бы, SoftMocks должен просто быть на последней стадии перед выполнением файла, и если эти фреймворки модифицируют код перед его исполнением, то вроде нет проблем. Или они основаны на eval? Если да, то ведь при желании несложно научить SoftMocks и с eval'ом работать
Привет!

Проблема в том, как Infection модифицирует файл. Он делает перехват инклюдов через stream_wrapper_register(), и подменяет на лету заинклюженный файл на файл с мутировавшим кодом. По-сути SoftMock действуют так же, просто через другой механизм.

В результате, подружить их друг с другом довольно сложно. Это возможно, но пришлось бы очень сильно влезть в код Infection.

Выглядит так, что нужно в одно место добавить SoftMocks::rewrite(), примерно также, как сделано для phpunit

И почему SoftMocks а не AspectMock?
Привет, спасибо за вопрос.
Если кратко, AspectMock умеет не все что нам было нужно.
Чтобы не пересказывать детали в комментарии — приведу статья, где мы подробно рассказывали зачем нам вообще понадобились софт моки habr.com/ru/company/badoo/blog/279617

SoftMocks предоставляет апи, очень близкий к runkit, потому что до этого использовался именно он. Не уверен, что сейчас поддерживает AspectMock, но на момент перехода он много чего не умел, например перехват констант, и для перехвата встроенных функций ему требовалось указать в конфиге все функции, которые нужно перехватить, и при этом (если я правильно помню) не перехватывались бы вызовы типа \time(), то есть когда явно указан корневой неймспейс

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