2013-12-09 18 views
4

對於AngularJS應用程序,推薦使用$ log服務而不是console.log。這種日誌記錄的一個常見用例是在運行測試時看到調試打印。問題是,angular-mock默認默認將$ log替換爲模擬。那麼,我有時需要測試我的調試打印,但我只是需要更頻繁地看到它。問題是,默認行爲堅持使用虛擬日誌記錄,我甚至沒有看到恢復到真實日誌的正確方法。我做了一個的jsfiddle例子來說明它,嘗試運行它,而在尋找devtools控制檯http://jsfiddle.net/ivan4th/EnvL9/

var myApp = angular.module('myApp', []); 

describe('myApp', function() { 
    var element, rootScope; 
    beforeEach(module('myApp')); 
    it('does something', inject(function ($log) { 
     $log.log("this message gets eaten by angular-mocks"); 
     console.log("this message is visible though"); 
    })); 
}); 

第一條消息被跳過,而第二個顯示爲預期。 爲什麼使用這種奇怪的行爲,有沒有辦法解決它,除了不使用$日誌?

回答

2

基於從dtabuenc的答案的想法,我實現了變通方法, 轉儲日誌失敗茉莉花測試輸出,在全球 afterEach()形式:

afterEach(inject(function ($log) { 
    // dump log output in case of test failure 
    if (this.results().failedCount) { 
    var out = []; 
    angular.forEach(["log", "info", "warn", "error", "debug"], function (logLevel) { 
     var logs = $log[logLevel].logs; 
     if (!logs.length) 
     return; 
     out.push(["*** " + logLevel + " ***"]); 
     out.push.apply(out, logs); 
     out.push(["*** /" + logLevel + " ***"]); 
    }); 
    if (out.length) { 
     console.log("*** logs for: " + this.description + " ***"); 
     angular.forEach(out, function (items) { console.log.apply(console, items); }); 
    } 
    } 
    $log.reset(); 
})); 

不幸的是,無需更換angular-嘲笑的$日誌執行 消息的順序不同的日誌級別丟失,但我想 我將能夠忍受。沉默所有日誌消息,包括 Angular自己的錯誤和警告在測試過程中聽起來仍然聽起來像是不好的 設計選擇。

5

模擬$ log服務旨在讓您輕鬆測試和斷言是否記錄消息,具有諷刺意味的是,在運行測試時防止日誌噪音傳送到控制檯。

,如果你不不喜歡這種行爲,你可以這樣做很容易地改變它:

console.log($log.log.logs) 

您可以添加:

$log.log = function(message){ console.log(message);}; 

替代你可以輸出所有以前通過做記錄的信息到控制檯無論是在茉莉花之前還是之後進入全球。

相關問題