Nyx*_*nyx 6 php tdd phpunit unit-testing
我已经使用PHP和JS编写了一个webapp,它现在正在工作,并决定我应该学习单元测试并在清理我的代码时实现它.
我对应该进行单元测试的内容感到困惑.每个PHPUnit教程我都见过测试getter,setters,计算数组中的项目.我正在处理的网站上有一个显示照片的页面.用户可以像照片或将其添加到他的收藏夹.PHP主要用于站点作为运行backbone.js的客户端的API层.
我该如何为这些功能编写单元测试?函数(如下所示)抓取通过AJAX发送给它的$ _GET数据,并将一些行插入数据库.它不包含任何setter,getters或计数任何东西,也不是一个类.它甚至应该进行单元测试吗?
我可以为这些函数编写的单元测试的一个例子真的很棒!:)
/**
* Create new Set and add item to it
* @return void
*/
public function action_create_set() {
// Get data from user
$user_id = Input::get('user_id');
$post_id = Input::get('post_id');
$set_name = Input::get('set_name');
// Create new set
$data = array(
'user_id' => $user_id,
'name' => $set_name
);
$set_id = DB::table('sets')->insert_get_id($data);
// Add item to newly created set
DB::query("INSERT IGNORE INTO posts_sets (post_id, set_id, user_id)
VALUES ($post_id, $set_id, $user_id)");
// Change `created_at` & `updated_at` col of 'sets'
$data = array(
'created_at' => DB::raw('NOW()'),
'updated_at' => DB::raw('NOW()')
);
DB::table('sets')
->where('id', '=', $set_id)
->update($data);
}
Run Code Online (Sandbox Code Playgroud)
对于第一个函数,我的印象是可以编写一个测试来检查这3个变量$user_id, $post_id, $set_name是否必须包含数据.我觉得应该有一个测试来检查2个insert查询是否有效,但我也认为插入行的函数是由PHP框架提供的,并且已经过全面测试,所以不需要进一步的单元测试.
另一个猜测是测试应该为函数提供3个变量,然后检查新行是否已插入到2个表中,但这不会被视为集成测试吗?
这是一个通过AJAX从用户获取输入的函数,然后以JSON格式返回结果.PHPUnit应该处理这种API函数吗?或者单元测试是否应该在客户端进行?
/**
* Get items Liked by user
* @return array
*/
public function action_likes() {
$user_id = Input::get('user_id');
$likes = DB::table('likes')
->join('posts', 'posts.id', '=', 'likes.post_id')
->where('likes.user_id', '=', $user_id)
->get();
return json_encode($likes);
}
Run Code Online (Sandbox Code Playgroud)
小智 4
首先,您应该制作一个“单元”来进行测试。
您当前的实现将所有内容都放入一个函数中。这样的代码很难测试。
首先,我建议将其分为 3 部分。
第一部分处理$_GET并组成内部表达式。然后第二部分将其保存到数据库中。最后,第三部分接收数据库中的对象,并渲染响应。
如果将其拆分,第二个和第三个函数将变得可测试。
这太天真了,但也许值得作为你的第一步。如果您有兴趣,请搜索MVC。