我想测试我的类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
答案 0 :(得分:1)
我猜您已经使用Composer安装了Silex,因此您在应用程序的最开始(可能在config.php中)包含Composer自动加载,以自动包含所有需要的文件。 问题是PHPUnit没有使用你的配置文件,所以它不会自动加载类:PHPUnit不会使用自动加载文件,除非你告诉它这样做。
要告诉PHPUnit加载自动加载文件,您有两个选择:
第一个是在命令行上执行测试时使用the bootstrap switch。这样,PHPUnit将在测试执行开始时包含引导程序文件。如果您将自动加载文件传递给它,它将自动加载您的课程。
第二个选项是使用configuration file,您可以在其中指定引导程序文件。
除此之外,还有一些关于你的代码的观察。您的单元测试不应使用您的真实数据库进行测试。这样,您的测试将修改真实数据库,使测试不可重复(例如,如果删除行,则必须使用数据重新填充数据库),速度慢,更重要的是,您可能会影响实际数据。
我建议您模拟数据库,或至少使用数据库进行测试。