2015-06-16 78 views
2

我有一個每週運行一次的報告。這個類基本上是這樣的(僞代碼):單元測試報告腳本

class mailreport { 
    public function exec() { 
    users = Users::getAll(); 
    for u in users { 
     r = this.generateReportData(u); 
     m = this.generateMail(r); 
     sendMail(u, m); 
    } 
    } 

    protected generateReport(User u) { 
    // do lots of calculation, return report 
    } 

    // ... 
} 

大多數本報告中的錯誤都在generateReport - 方法。它也做了很多漂亮的「純粹」計算,並且如果它沒有被保護,很容易進行單元測試。該exec - 方法是很難測試,因爲它有幾個依賴和輸出是一個HTML電子郵件發送。

我應該如何打出來的generateReport - 方法,所以我可以單元測試更容易嗎?當然,我可以創建某種Report -class與公共generate - 方法,但後來爲什麼不只是有一個獨立的功能?

回答

0

從技術上講,你可以單元測試PHPUnit中的一個保護方法的語法如下:

$object = new MailReport(); 
$reflection = new \ReflectionClass(get_class($object)); 
$method = $reflection->getMethod('generateReport'); 
$method->setAccessible(true); 

return $method->invokeArgs($object, [new User()]); 

然而,如果你的類是做太多的一個方法,它可能是打破它一個好主意。如果你能得到一個單元測試覆蓋了大部分generateReport(或新類)的,然後你可以重構它分成更小的方法和驗證,它仍然致力於通過測試。