@solncebro

Как PHPunit эмулировать запрос к БД?

Здравствуйте!
Хочу написать тест для функции:
function calculateLimits($pdo, $interval, $timeStart)
{
    $intervalMinutes = getMinutesFromInterval($interval);

    $lastUpdate = $pdo->query("SELECT updated FROM last_updates
                                    WHERE table_name = 'candles${interval}';")->fetchColumn();
    $lastUpdateCarbon = Carbon::parse($lastUpdate, 'UTC');
    $diffInSecond = $timeStart->diffInSeconds($lastUpdateCarbon);

    $limit = $diffInSecond / (60 * $intervalMinutes);
    
    return ceil($limit);
}


Как вы видите, там есть переменная, которая зависит от ответа БД. Я никак не могу понять как эмулировать запрос к БД. Делаю вот так:
class CandlestickTest extends TestCase
{
    private $stub;

    public function setUp()
    {
        $this->stub = $this->getMockBuilder('PDO')
                            ->disableOriginalConstructor()
                            ->setMethods(['query', 'fetchColumn'])->getMock();
    }

    public function testCalculateLimits()
    {
        $this->stub->method('query')->with("SELECT updated FROM last_updates
                                    WHERE table_name = 'candles30m';")
                    ->method('fetchColumn')->willReturn('2019-01-26 23:50:49');
        $this->assertEquals(48, C\calculateLimits($this->stub, '30m', '2019-01-27 23:50:49'));
    }
}


Как только ->method('fetchColumn') после method('query')->with(), тесты выдают мне предупреждение:
Method name matcher is already defined, cannot redefine

Гугл по этой ошибке ничего не выдает - только похожие ошибки. Почему он считает, что я переопределяю метод?! Не пойму как сделать, чтобы заработало.

Мне нужно чтобы просто во время тестирования функции calculateLimits, когда происходит запрос к БД, этот самый запрос не выполнялся и просто подставлялась строка '2019-01-27 23:50:49', а не вот это все.

PS. Не пойму предназначение with и will. Такое ощущение, что PHPunit от меня хочет чтобы я подставил РЕАЛЬНЫЕ аргументы в with и реальный возврат функции query в will.
  • Вопрос задан
  • 58 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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