Esiste un modo fattibile per testare query SQL che contengono cose come CURRENT_DATE
e NOW()
in un test di unità?
Ad esempio:
public function deletePastEntries(): bool {
$sql = "DELETE FROM queue WHERE period_end < NOW();";
return $this->db->query($sql)->execute();
}
E nel mio test di unità:
class QueueTest extends AbstractDatabaseTestCase
{
// ...<snip>...boilerplate stuff
public function testDeletePastEntries(): void {
$this->object->deletePastEntries();
$actualTable = $this->getConnection()->createQueryTable('queue', 'SELECT id, user, period_start, period_end FROM queue ORDER BY id;');
$expectedTable = $this->createArrayDataSet([
'queue' => [/* stuff that should remain */]
])->getTable('queue');
static::assertTablesEqual($expectedTable, $actualTable);
}
}
Ho taggato PHPUnit ma questa domanda dovrebbe essere abbastanza generica per qualsiasi tipo di test del database.
Per gli usi di derisione di cose come new \DateTime()
(predefinito a "now"), posso cambiare la funzione per accettare un parametro. Suppongo di poter modificare tutte le query per prendere un parametro anziché NOW()
o le funzioni dipendenti dal tempo, ma non sono sicuro che la modifica di tutte le query per questo scopo sia la giusta via da seguire, soprattutto per le cose che non lo sono ha senso passare in date / orari arbitrari. Inoltre, l'uso di parametri significherebbe che devo costruire i valori di quei parametri nell'applicazione e passarli dentro.