@badicean

Правильно ли я пишу моки?

Тестирую определенное событие, все нормально получается. Подскажите пожалуйста, правильно ли я использую возможности phpunit ?
public function test_mp_bid_update()
    {
        $advert_id = rand(1,9);

        // mock form
        $user_data = $this->getMock('AdvertForm');
        $user_data->hash = $this->hash;

        // mock advert
        $advert = new Advert();
        $advert->id = $advert_id;

        $publisher = $this->getMockBuilder('AdvertPublisher')
                            ->setConstructorArgs([$user_data])
                            ->getMock();
        $publisher->advert = $advert;

        $event_mock = $this->getMock('CEvent');
        $event_mock->sender = $publisher;

        $event_handler = new UpdateMpBidEvent();
        $event_handler->call($event_mock);

        $updated_mp_bid = MpBid::model()->findByAttributes(['hash'=>$this->hash]);
        $this->assertEquals($advert_id, $updated_mp_bid->advert_id);


    }


Само событие
<?php
class UpdateMpBidEvent
{
    public function call(CEvent $event)
    {
        $advert_id = $event->sender->advert->id;
        $hash = $event->sender->user_data->hash;
        $mp_bid_updated = MpBid::model()
                                    ->findByAttributes(['hash'=>$hash])
                                    ->updateAll(['advert_id'=>$advert_id]);
        return $mp_bid_updated;
    }
}
  • Вопрос задан
  • 1225 просмотров
Решения вопроса 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
крофьИзГлаз.jpg

Вы не задумывались, почему в моках можно подменять методы, а не свойства?

Основной смысл мока в том, что вы можете задать и проконтролировать его поведение.

1. Прочитайте про PSR, не плодите каку.
2. Моки имеет смысл делать без конструктора И прописывать заглушки под вызываемые методы.
3. Методы, что не должны быть вызваны - тоже заменяются заглушками, но в expects заганяете never.
4. Старайтесь не использовать статику, на сколько это возможно. Тестировать ее возможно только косвенно.
5. Старайтесь соблюдать SOLID. В вашем примере может это конечно неудачное название, но ивент как правило - это некий скоп данных, не стоит обременять его логикой.
6. Работа с бд в ActiveRecord может и удобная, на для тестов - эт говно, сточки зрения безопасности и расширения - увы, тоже. Конкретно в вашем случае создайте отдельный метод, который будет обновлять ваш идентификатор, напишите тест для него который будет работать с БД. Для ивента вам стоит проверять только тот факт, что метод вызвался с корректными данными.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы