php - 像这样的功能应该有单元测试吗?

标签 php unit-testing tdd phpunit

我使用 PHP 和 JS 编写了一个 web 应用程序,现在可以正常工作了,我决定现在应该学习单元测试并在清理代码的同时实现它。

我对应该对什么进行单元测试感到困惑。我见过的每个 PHPUnit 教程都测试 getter、setter 和数组中的项目计数。我正在使用的网站有一个显示照片的页面。用户可以喜欢照片或将其添加到他的收藏夹。 PHP 在站点中主要用作运行 backbone.js 的客户端的 API 层。

我应该如何为这些功能编写单元测试?一个函数(如下所示)获取通过 AJAX 发送给它的 $_GET 数据,并将一些行插入到数据库中。它不包含任何 setter、getter 或任何计数,也不是一个类。它甚至应该进行单元测试吗?

我可以为这些功能编写的单元测试示例真的很棒! :)

/**
 * 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);
}

对于第一个函数,我的印象是可以编写一个测试来检查这 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);

}

最佳答案

首先,您应该制作一个“单元”进行测试。

您当前的实现将所有内容都放入一个函数中。这样的代码很难测试。

首先,我建议将它分成 3 个部分。

第一部分处理$_GET 并组成一个内部表达式。 然后第二部分将其保存到数据库中。 最后,第三部分接收数据库中的对象,并渲染响应。

如果将其拆分,第二个和第三个函数将变得可测试。

这太天真了,但作为您的第一步也许值得。如果您有兴趣,请搜索 MVC。

关于php - 像这样的功能应该有单元测试吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11894199/

相关文章:

unit-testing - 即使在其中一个依赖项调用抛出异常之后也验证调用的测试用例

wpf - 如何使用 TDD 测试 BusyIndi​​cator IsBusy 属性

php - 在 PHP 中从文本区域发送文本

php - 在后端加载目录设置时出现 fatal error

php - 配置 PHP 以使用 MySQL 和 phpMyAdmin

android - 使用 Firebase 进行单元测试

php - 如何将一条记录的 ID 添加到另一条记录的列中?

java - 在 1 个测试方法中使用 junit @Rule、expectMessage()、匹配器来处理多个异常

javascript - 测试 commonjs 模块的替代方案是什么?

java - 测试驱动开发、单元测试