像这样的功能有单元测试吗?

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。