【问题标题】:Mocking a pdo object gives simple parameter error模拟 pdo 对象会给出简单的参数错误
【发布时间】:2014-11-05 22:26:35
【问题描述】:

我正在尝试模拟 PDO 对象,但收到错误消息“PDO::__construct() 需要至少 1 个参数,给定 0”

我要模拟的班级在这里:

class MockPDO extends PDO
{

public function __construct() {
try 
    {
     $dsn = "mysql:host=localhost;dbname=somedatabase";
     parent::__construct($dsn, "root", "root"); 
    }
    catch (PDOException $exception) 
    {
     die($exception->getMessage());
    }
 }
}

我的测试班在这里

class DatabaseTest extends \PHPUnit_Framework_TestCase
{
public function testFindById() {
$pdo = $this->getMock('PDO', array('prepare'));
$stmt = $this->getMock('PDOStatement', array('execute', 'fetch'));
$stmt->expects($this->once())->method('execute')->with($this->equalTo(array(':id' => 2)));
$stmt->expects($this->once())->method('fetch');

$pdo->expects($this->once())->method('prepare')
  ->with($this->equalTo('SELECT * FROM sometable WHERE id => :id'))
  ->will($this->returnValue($stmt));
}

我知道这很简单,但我做错了什么?

【问题讨论】:

标签: php mysql unit-testing pdo phpunit


【解决方案1】:

我对这个问题的解决方案是为 pdo 创建一个包装类。这是为了销毁构造函数。 除非您向构造函数提供有效的连接字符串

如何提供构造函数参数的示例:

$pdo = $this->getMock('PDO', array('prepare', '__construct'), ["mysql:host=server;dbname=db;"]);

解决方案:

class PDOMock extends \PDO {
    public function __construct() {} }

class PDOTest extends \PHPUnit_Framework_TestCase {
    public function setup() {
        $pdo = $this->getMockBuilder('PDOMock')
            ->getMock();
    } }

【讨论】:

    【解决方案2】:

    PhpUnit 调用对象的构造函数,除非你明确告诉不要这样做

    $pdo = $this->getMockBuilder('PDO')
        ->disableOriginalConstructor()
        ->setMethods(array('prepare'))
        ->getMock();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2011-03-09
      • 2016-11-18
      • 2017-03-24
      • 1970-01-01
      相关资源
      最近更新 更多