[英]How can I mock a subroutine for Unit testing in Perl?
在這里,我為需要執行單元測試的子例程提供了偽代碼。
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
,但未獲得確切結果。
我認為這不是嘲笑的好人選。
第一個問題是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
。 這留下了數據庫連接的問題。
我不太喜歡嘲笑,以至於所有外部服務都已刪除。 如果要編寫SQL,則需要一個SQL數據庫來運行它,否則就不會真正測試該功能。 我將假設存在一個具有與生產數據庫匹配的架構的測試數據庫。 您的測試可以使用所需的任何數據填充它,並在腳本結尾處回滾。
最簡單的方法是編寫connect_to_database
以便使用測試環境變量來連接到測試數據庫。 更好的是擁有一個環境變量,該變量控制整個系統在哪里尋找整個測試套件可以利用的配置信息。
get_detail_team
並不需要太多測試,它只是一個薄包裝。 為此編寫基本的集成測試,並專注於測試get_html_content
,您只需傳遞數據結構即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.