Ваша непосредственная проблема с ошибкой решается отключением конструктора в вашем фиктивном объекте.
$users = $this->getMockBuilder('DatabaseTable')
->disableOriginalConstructor()
->getMock();
Однако меня больше беспокоит то, что ваш тест на самом деле не проверяет ничего полезного.У вас есть набор данных, который вы создали в тесте, а затем передаете эти данные в макет с помощью метода no-op insert
, который вы также создали в том же тесте.На самом деле это не проверяет функциональность любого кода, который не является частью самого теста.
Если ваша цель здесь состоит в том, чтобы протестировать класс DatabaseTable, тогда фактическая граница фиктивного объекта - это объект PDO, и выхотите убедиться, что класс DatabaseTable действительно вызывает prepare
и execute
правильно.
<?php
require 'classes/DatabaseTable.php';
class savedataTest extends \PHPUnit_Framework_TestCase
{
public function testValidData()
{
$validData = [
'firstname' => 'John',
'lastname' => 'Smith',
'email' => 'john@example.org'
];
$table = 'users';
$stmt = $this->createMock('PDOStatement');
$stmt->expects($this->once())
->method('execute')
->with($validData)
->willReturn(true);
global $pdo;
$pdo = $this->createMock('PDO');
$pdo->expects($this->once())
->method('prepare')
->with("INSERT INTO {$table} (firstname, lastname, email) VALUES (:firstname, :lastname, :email)")
->willReturn($stmt);
$users = new DatabaseTable($table);
$users->insert($validData);
}
}