perl - 如何在 Perl 中模拟单元测试的子例程?

标签 perl unit-testing cpan

这里我给出了需要进行单元测试的子例程的伪代码。

sub get_detail_team(param1,param2){

   my $dbh   = connect to databasehandle
   my sql    = get_sql_details(param1,param2)
   my $sth   = $dbh->prepare($sql)
       $sth->execute()
   my $result = $sth->fetchall_arrayref();

return get_html_content($result,prama)
}

get_sql_details() 和 get_html_content() 也是同一个包中的子例程。 我们如何对 get_detail_team() 函数进行单元测试?

我尝试过使用这个Test::Mockmodule,但没有得到确切的结果。

最佳答案

我认为这不适合 mock 。

第一个问题是 get_detail_team 做了两件事,它获取数据并格式化它。格式化数据比数据结构更难测试。将格式化与功能分离可以使测试变得更加容易,并且可以更轻松地添加更多格式化程序。稍后重构一个提取方法...

sub get_detail_team_data($param1, $param2) {
   my $dbh   = connect_to_database;
   my $sql   = get_sql_details($param1, $param2);
   my $sth   = $dbh->prepare($sql)
   $sth->execute();
   return $sth->fetchall_arrayref();
}

sub get_detail_team($param1, $param2) {
    my $detail_team = get_detail_team_data($param1, $param2);
    return get_html_content($detail_team);
}

现在我们可以专注于测试数据。查看get_detail_team_data,它只是get_sql_details 的一个薄包装。要测试 get_sql_details,您需要获取 SQL 并查看它是否获取了预期的数据,而这正是 get_detail_team_data 所做的。您不妨将测试重点放在 get_detail_team_data 上,仅进行 get_sql_details 的基本集成测试。这就剩下数据库连接的问题了。

我不喜欢如此多的 mock ,以至于所有外部服务都已被删除。如果您要编写 SQL,则需要一个 SQL 数据库来运行它,否则您并没有真正测试该功能。我将假设存在一个测试数据库,其架构与生产数据库相匹配。您的测试可以使用他们喜欢的任何数据填充它,并在脚本末尾回滚。

最简单的事情就是编写connect_to_database,以便它支持测试环境变量来连接到测试数据库。更好的是有一个环境变量来控制整个系统在哪里查找整个测试套件可以利用的配置信息。

get_detail_team 不值得太多测试,它只是一个薄包装。为它编写基本的集成测试,并专注于测试 get_html_content ,您只需传递一个数据结构即可。

关于perl - 如何在 Perl 中模拟单元测试的子例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28103986/

相关文章:

perl - cpan模块目录结构

perl - 打包一个简单的 perl 脚本供运行 Windows 的 "average Joes"使用

perl - 我应该在 Perl 中使用自动装箱吗?

python - 在当前目录和子目录中的每个 Python 文件顶部添加一行

perl - 为什么 Perl 的 foreach 不要求用 my 声明它的变量?

perl - 在 Perl 中使用三元条件运算符有更短的方法吗?

python - AssertRaises 不可调用

c# - FakeItEasy 模拟对象修改方法

unit-testing - 无法模拟 .... 必须启用分析器才能模拟、安排或执行指定的目标

perl - 您如何阅读 CPAN 变更日志?