соответственно при тестировании необходимо обернуть его в Mock
Ну как бы это логично, при юнит тестировании все, кроме того что мы непосредственно тестим, должно быть заменено моком/стабом.
Писать в каждой модели конструктор?
Что вы понимаете под "модель"? Ваши бизнес-объекты? У них в конструкторе должно быть только то, что им нужно.
а если источников будет много
То это повод пересмотреть архитектуру, почитать про цепочки обязанностей, стратегии, про сегрегацию интерфейсов в конце концов.
User::model()->prepareBuy(new Order, New Profile, $userId)
Прочитайте эту строчку кода, и скажите что тут происходит, ибо я не могу этого понять.
Ну и да, помимо внедрения зависимостей в конструктор, есть еще такая неплохая штука как double dispatch, когда нужные сервисы передаются как аргументы методов, которым они нужны. Так наш класс не зависит от непонятных вещей и таким образом мы все можем спокойно тестить.