Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于mockry框架的PHPUnit数据库测试_Php_Postgresql_Unit Testing_Phpunit_Mockery - Fatal编程技术网

基于mockry框架的PHPUnit数据库测试

基于mockry框架的PHPUnit数据库测试,php,postgresql,unit-testing,phpunit,mockery,Php,Postgresql,Unit Testing,Phpunit,Mockery,最近我遇到了PHP模拟对象的模拟框架。我有一个类,它的构造函数接受postgreSQL连接参数,并连接到数据库和其他DML操作方法。我想为这些方法编写测试用例,而不实际连接到数据库,因此我想使用mockry 下面是DBConnection类的一个简单示例。有谁能给我一个运行select方法测试用例的示例代码吗 class DBConnection { private $conn; //db connection private $debug = false; private $schema

最近我遇到了PHP模拟对象的模拟框架。我有一个类,它的构造函数接受postgreSQL连接参数,并连接到数据库和其他DML操作方法。我想为这些方法编写测试用例,而不实际连接到数据库,因此我想使用mockry

下面是DBConnection类的一个简单示例。有谁能给我一个运行select方法测试用例的示例代码吗

class DBConnection {
 private $conn; //db connection
 private $debug = false;
 private $schema;

 public function __construct($host, $user, $pass, $db, $schema = 'main', $debug = DEBUG) {
    $this->debug = $debug;
    $this->conn = pg_connect("host=$host user=$user password=$pass dbname=$db");
    if(!$this->conn) {
        throw new DatabaseException('Database connection failed');
         }
   }


  public function select() {
   $result = pg_prepare($this->conn, "my_query", 'SELECT * FROM shops WHERE name = $1');
   $result = pg_execute($this->conn, "my_query", array("Joe's Widgets"));
   return $result;
   }
}

我假设您想要模拟
DBConnection->select()
方法,并确保调用
pg\u prepare()
pg\u execute()
函数

如果以上是真的,我编写了一个composer包来帮助尝试测试php函数调用
单元测试/function spy
()

首先,必须为
DBConnection
类命名名称空间。让我们假设它位于名称空间
MyNamespace
中。然后在测试中,您可以执行以下操作:

<?php namespace MyNamespace
    use UnitTesting\FunctionSpy\Spy;

    class DBConnectionTest extends \PHPUnit_Framework_TestCase {
        use \UnitTesting\FunctionSpy\SpyTrait;

        protected function setUp()
        {
            // init the spy
            $this->initSpy();
        }
        protected function tearDown()
        {
            // flush the spy so we can reset the calls after every test
            $this->flushSpy();
        }


        function test_construct_callsPgConnect_AndSetsConnection()
        {
             // create a fake return value for pg_connect()
             $this->spy['pg_connect'] = 'connection';
             $object = new DBConnection('host', 'user', 'pass', 'db', 'schema');
             $this->assertFunctionLastCalledWith('pg_connect', array('host=host user=user password=pass dbname=db'));

             $conn = $object->getConnection();  // your class doesn't have this method implemented, but it just returns the connection
             $this->assertEquals('connection', $conn);

        }

    }

    function pg_connect()
    { 
         return Spy::pg_connect();
    }

有没有办法模拟数据库?有没有像测试数据库或其他选项这样的好选择?