我想知道我是否可以为以下类中的函数getAll进行其他单元测试(我指的是在不依赖测试数据库的情况下可以进行的其他单元测试):
<?php
namespace Example'Model;
use Example'Lib'PdoConnection;
class UserModel {
private $pdoConn;
function __construct()
{
$this->pdoConn = PdoConnection::getInstance();
}
function getAll()
{
$arrUsers = array();
$strSql = "SELECT id, first_name, last_name FROM user";
$arrData = array();
try
{
$objRes = $this->pdoConn->prepare($strSql);
$objRes->execute($arrData);
$objRes->setFetchMode('PDO::FETCH_ASSOC);
$arrUsers = $objRes->fetchAll();
}
catch('PDOException $e) {
error_log($e->getMessage());
}
return $arrUsers;
}
以下是我测试它的方法:
function testGetAll()
{
$stubUserModel = $this->getMockBuilder('Example'Model'UserModel')
->disableOriginalConstructor()
->getMock();
$stubUserModel->method('getAll')
->willReturn(array(array('id' => 1, 'first_name' => 'First1', 'last_name' => 'Last1'), array('id' => 2, 'first_name' => 'First2', 'last_name' => 'Last2')));
$this->assertEquals(array(array('id' => 1, 'first_name' => 'First1', 'last_name' => 'Last1'), array('id' => 2, 'first_name' => 'First2', 'last_name' => 'Last2')), $stubUserModel->getAll());
}
我知道它需要更多的测试才能被认为是经过了良好的单元测试,我上面写的测试是无用的。
我发现很难进行测试,因为它依赖于类PDOConnection以及准备好的语句返回的类(在本例中,实例化的obj是$objResult)。这是否意味着我必须重构代码,将PDOConnection依赖项移到此函数之外,并可能将$objRes作为参数传递给getAll函数才能模拟它?或者还有另一种更便宜的方法使其可测试?
欢迎所有建议。
感谢
由于依赖项注入,您应该将pdo连接作为构造函数参数传递。然后,您可以考虑模拟连接,并确保使用预期的参数在预期的时间调用预期的方法。您可以使用Mockery、Prophecy或phpunit mock对象等库。那么这不是一个模型,而是一个提供者或存储库。因此,您应该将其称为UserProvider或UserRepository