使用PHPUnit的Test数据库/数据进行功能测试

时间:2014-06-12 02:14:44

标签: php unit-testing testing phpunit

我是PHPUnit测试的新手,所以感谢您的帮助,看看我是否采用了正确的方法。

我试图测试我的方法;我有两个问题

1)如何让测试数据库包含虚拟数据?现在我在pdo_connect类和该类的构造函数中拥有所有数据库设置,我正在进行所有数据库初始化,包括dbname,host,...;我已经包含了我想在这里测试的方法以及我的测试用例;我的问题是,根据不同的环境改变我的测试数据库是否是一个好习惯;例如,如果'环境'我的设置中的变量是' test'我使用'测试'具有虚拟数据的数据库......

2)如果你确认我下面提到的示例测试用例是我的方法的功能测试的正确方法,我也非常感激!

static public function get_images($id) {
    try {
        $conn = new pdo_connect();
        $query = "  SELECT ....";
        $result = $conn->prepare($query);
        $result->bindParam(':id', $id);
        $result->execute();
        $array_result = $result->fetchAll(PDO::FETCH_OBJ);        
        $result_Set = array($paginate_result, TRUE);
    }
    catch (Exception $e) {
        $result_Set = array($e->getMessage(), FALSE);
    }
    return $result_Set;
}

和我的测试:

class SomeTest extends PHPUnit_Framework_TestCase {
    public function __construct() {
        require_once('../includes/model.php');
    }
    public function test_id_not_exist() {
        $con = $this->getMock('conn');  
        $dao = new Model($con);
        $result = MODEL::get_images(555);
        $expected = array(array(), True);
        self::assertEquals($expected, $result);
    }
}

如果您需要更多说明,请告诉我......我再次提前感谢...

1 个答案:

答案 0 :(得分:2)

作为一般规则:测试静态函数可能会变得棘手,但在您的情况下它可能会起作用。

如果这是您的实际代码,则无法切换到测试数据库,因为您使用$ conn = new pdo_connect()连接get_images。

您需要的是依赖注入的一些方式来插入连接。您不需要模拟它,您可以使用与测试数据库的真实连接。

你可以这样做:

class Model {
    private static $_conn;

    public static function setDb($conn) {
        self::$_conn = $conn;
    }


    static public function get_images($id) {
        try {
            $conn   = self::$_conn;
            ...
        } catch (Exception $e) {
            $result_Set = array($e->getMessage(), false);
        }

        return $result_Set;
    }
}

您的测试将成为这个(我还删除了一些其他问题):

public function test_id_not_exist() {
    $con = new pdo_connect();
    Model::setDb($con);
    $result = Model::get_images(555);
    $expected = array(array(), True);
    $this->assertEquals($expected, $result);
}

要正确播种测试数据库,您可以在测试类中实现setUp函数,然后可以插入一些虚拟数据。