phpunit用silex php测试一个mapper

时间:2014-03-08 10:24:54

标签: php phpunit silex

我想测试我的类LocationMapper,其目的是进行CRUD操作:

<?php
class LocationMapper {
/*
* Database connection.
*/
var $db = NULL;


/*
* Constructor function. Loads model from database if the id is known.
*
* @param $db
*   Database connection
*/
function __construct($app) {    
    $this->db = $app['db'];
}

    /**
    * Load data from the db for an existing user.
    */
    function read($app, $id) {
    $statement = $this->db->prepare('SELECT * FROM location WHERE id = :id');
    $statement->execute(array(':id' => $id));
    $data = $statement->fetch(PDO::FETCH_ASSOC);
    $comments = $app['CommentMapper']->loadAllByLocation($id);
    $location = new Location($data['latitude'], $data['longitude'],     $data['address'], $data['name'], $data['checked'], $comments);
    $location->set('id', $data['id']);
    return $location;
   }
    ...
}

在我的index.php中,我创建了我的数据库连接和我的映射器:

require_once __DIR__ . '/../config.php';

// Add the database connection as a shared service to the container.
$db_string = 'mysql:host=' . $app['db.hostname'] .';dbname=' . $app['db.dbname'];
$app['db'] = $app->share(function ($app) use ($db_string) {
   try {
      return new PDO($db_string, $app['db.username'], $app['db.password']);
   }
   catch (PDOException $e) {
      $app->abort(500, 'Unable to connect to database.  Check your configuration');
   }
});

// Initialize mappers
$app['LocationMapper'] = $app->share(function () use ($app) {
   return new LocationMapper($app);
});

如何使用真实数据库测试类LocationMapper? 我测试了这个:

class LocationMapperTest extends PHPUnit_Framework_TestCase
{
    protected $locationMapper;
    protected $app;

    public function setUp() {
        $app = new Silex\Application();       

        // Add the database connection as a shared service to the container.
        $db_string = 'mysql:host=' . $app['db.hostname'] .';dbname=' . $app['db.dbname'];
        $app['db'] = $app->share(function ($app) use ($db_string) {
        try {
           return new PDO($db_string, $app['db.username'], $app['db.password']);
        }
        catch (PDOException $e) {
           $app->abort(500, 'Unable to connect to database.  Check your configuration');
        }
        });
        $locationMapper = new LocationMapper();
   }

   public function createTest() {        
        $this->assertEquals(0, 0);
   }
}

但我有一个错误PHP Fatal error: Class 'Silex\Application' not found

1 个答案:

答案 0 :(得分:1)

我猜您已经使用Composer安装了Silex,因此您在应用程序的最开始(可能在config.php中)包含Composer自动加载,以自动包含所有需要的文件。 问题是PHPUnit没有使用你的配置文件,所以它不会自动加载类:PHPUnit不会使用自动加载文件,除非你告诉它这样做。

要告诉PHPUnit加载自动加载文件,您有两个选择:

第一个是在命令行上执行测试时使用the bootstrap switch。这样,PHPUnit将在测试执行开始时包含引导程序文件。如果您将自动加载文件传递给它,它将自动加载您的课程。

第二个选项是使用configuration file,您可以在其中指定引导程序文件。

除此之外,还有一些关于你的代码的观察。您的单元测试不应使用您的真实数据库进行测试。这样,您的测试将修改真实数据库,使测试不可重复(例如,如果删除行,则必须使用数据重新填充数据库),速度慢,更重要的是,您可能会影响实际数据。

我建议您模拟数据库,或至少使用数据库进行测试。