Здравствуйте!
Хочу написать тест для функции:
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.