不能用嘲弄 phpunit 来模拟对象

Posted

技术标签:

【中文标题】不能用嘲弄 phpunit 来模拟对象【英文标题】:cannot mock object with mockery phpunit 【发布时间】:2019-08-10 20:12:27 【问题描述】:

我想测试连接到数据库,我有一个测试:

$author=['db_host'=>'a','db_name'=>DB_NAME,'db_user'=>DB_USER,'db_pass'=>DB_PASS,'db_timeout'=>DB_TIMEOUT];    

$mock_db=\Mockery::mock('DB')->makePartial();
$mock_db->shouldReceive('getAuthorDb')->andReturn($author);
$mock_ctrl= new DB;
$mock_ctrl->getAuthorDb=$mock_db;
$result=$mock_ctrl->getConnect();
$this->assertNotNull($result);

这是 DB 类:

class DB

    public $obj = null;
    public $table = 'contacts';
    public function __construct()
        $this->getConnect();        
    
    public function getAuthorDb()
        return ['db_host'=>HOST,'db_name'=>DB_NAME,'db_user'=>DB_USER,'db_pass'=>DB_PASS,'db_timeout'=>DB_TIMEOUT];
    
    public function getConnect()
        try
            $author=$this->getAuthorDb();
            $dsn="mysql:host=".$author['db_host']."; dbname=".$author['db_name'];
            $this->obj = new \PDO($dsn, $author['db_user'], $author['db_pass'],$author['db_timeout']);
            $this->obj->query("set names 'utf8' ");
        
        catch(\Exception $e)
        
            echo $e->getMessage();  exit;
        
    

但显然 getAuthorDb 方法不是模拟的。这是reak数据。为什么?!

请帮忙

【问题讨论】:

【参考方案1】:

当您调用new DB 时,您正在创建真正的类,而不是模拟类。您必须将模拟的数据库实例传递给正在使用它的任何类或函数。 要记住的重要一点是,模拟类仍然是类,您不会在全局范围内替换名称 DB 或任何东西。您必须在某处使用模拟类,否则它就坐在那里。

【讨论】:

以上是关于不能用嘲弄 phpunit 来模拟对象的主要内容,如果未能解决你的问题,请参考以下文章

嘲弄如何断言类实例

模拟数据库查询 laravel 嘲弄

用嘲弄来嘲弄 trait 方法

PHPUnit简介及使用

嘲弄:模拟对象上不存在方法

用嘲弄来测试 Laravel 外观总是通过,即使它应该失败