Можно ли смоделировать метод, связанный через атрибут? - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть следующая функция PHP, для которой я пытаюсь написать тест PHPUnit:

public function getDisplayMode()
{
    if($this->request->query->get('master_video'))
    {
        return 'listTranslations';
    }
    else
    {
        return 'default';
    }
}

Строка $this->request->query->get('master_video') - это то, с чем у меня проблемы.

Я смоделировал объект request, поэтому, если бы это был просто $this->request->get('master_video'), я мог бы легко использовать метод method, чтобы сообщить моей системе, что должно быть возвращено get.

Но я не знаю, как это сделать, когда предполагается наличие свойства query.(Например, я не знаю ни одного метода property для моего фиктивного объекта.)

Есть ли способ определить, что должно быть возвращено методом get здесь?

1 Ответ

0 голосов
/ 27 сентября 2018

Создайте макет query и укажите, что происходит на ->get().В итоге тест выглядел бы примерно так:

public function testGetDisplayMode() {
    $mockQuery = $this->getMockBuilder('Query') // Or whatever the query class is
         ->setMethods(['get'])
         ->getMock();

    $mockQuery->expects($this->once())
         ->method('get')
         ->with('master_video')
         ->willReturn('foo');

    $mockRequest = $this->getMockBuilder('Request') // Or whatever the request is
         ->getMock();

    $mockRequest->query = $mockQuery;

    $sut = new Bar($mockRequest) // Or however you instantiate the class with the mock request.

    $mode = $sut->getDisplayMode();
    // Do your assertions on the returned mode here.
}

Как правило, я обнаружил, что когда я делаю что-то подобное, у меня есть фиктивный объект, возвращающий фиктивный объект, это запах кода,Ваш метод здесь не нуждается в запросе $ this->, ему нужен объект запроса.Вы должны передать это непосредственно объекту или передать его этому методу.

Не зная больше о классе, который вы делаете, я не могу дать больше советов.

Если что-тотрудно написать тест, это признак того, что вы не оптимально разработали свой код.

...