Это пример класса с жесткой зависимостью, который не может быть тестируемым модулем.
Мы могли бы провести тестирование с подключением к другой базе данных, но тогда это уже не модульный тест, а интеграционный тест.
Лучшая альтернатива, о которой я думаю, - это иметь класс QueryFactory, который обернет все необходимые вам методы, а затем вы сможете его высмеять.
Сначала я создаю интерфейс
interface iQueryFactory
{
function firstFunction($argument);
function secondFunction($argument, $argument2);
}
QueryFactory со всеми вашими запросами ORM, которые нам нужны
class QueryFactory implements iQueryFactory
{
function firstFunction($argument)
{
// ORM thing
}
function secondFunction($argument, $argument2)
{
// ORM stuff
}
}
Существует бизнес-логика с внедрением фабрики запросов
class BusinessLogic
{
protected $queryFactory;
function __construct($queryFactoryInjection)
{
$this->queryFactory= $queryFactoryInjection;
}
function yourFunctionInYourBusinessLogique($argument, $argument2)
{
// business logique
try {
$this->queryFactory->secondFunction($argument, $argument2);
} catch (\Exception $e) {
// log
// return thing
}
// return stuff
}
}
Макет, обратите внимание, что я не использую макет фреймворка для моего примера (кстати, вы можете создать установщик ответа)
class QueryFactoryMock implements iQueryFactory
{
function firstFunction($argument)
{
if (is_null($argument))
{
throw new \Exception("");
}
else
{
return "succes";
}
}
function firstFunction($argument, $argument2)
{
// sutff
}
}
Затем, наконец, юнит-тесты, которые проверяют нашу бизнес-логику с помощью фиктивной реализации
class BusinessLogicTest extends PHPUnit_Framework_TestCase
{
public function setUp()
{
require_once "BusinessLogic.php";
}
public function testFirstFunction_WhenInsertGoodName()
{
$queryMockup = new QueryFactoryMock();
$businessLogicObject = new BusinessLogic($queryMockup);
$response = $businessLogicObject ->firstFunction("fabien");
$this->assertEquals($response, "succes");
}
public function testFirstFunction_WhenInsetNull()
{
$queryMockup = new QueryFactoryMock();
$businessLogicObject = new BusinessLogic($queryMockup);
$response = $businessLogicObject->firstFunction(null);
$this->assertEquals($response, "fail");
}
}