Test
Jasmine (test framework)
Jasmine 是 AngularJS 預設的 test framework (AngularJS 本身是用這套 test framework 來做 test 的意思)。
Jasmine 提供了測試 JavaScript 需要的各種工具, 這邊列出比較常在 AngularJS 的 test 裡面會看到的關鍵字:
describe
it
expect().to*
beforEach / afterEach
spyOn
jasmine.createSpy
在 run Jasmine test 的時候其實完全不在 AngularJS 本身的 context 裡面,因此你需要想方設法設定周圍的環境,讓測試的對象感覺(?)自己是身在 AngularJS 的 context 裡,並且各種需要的 serivce 也都能夠手到擒來。
[範例]
SpecRunner.html :
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="src/Player.js"></script>
<script type="text/javascript" src="src/Song.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="spec/SpecHelper.js"></script>
<script type="text/javascript" src="spec/PlayerSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
SpecRunner.html :
<!-- include source files here... -->
<script type="text/javascript" src="lib/angular/angular.js"></script>
<script type="text/javascript" src="lib/angular-mocks/angular-mocks.js"></script>
<script type="text/javascript" src="../app/js/controllers.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="unit/controllersSpec.js"></script>
其實寫 spec 就跟你平常直接寫在 HTML 裡的 script tag 裡沒兩樣,只是前面載入了 Jasmine 跟 AngularJS 罷了。
[ngMock]
(angular-mocks.js)
ngMock 是 AngularJS 用來協助你進行 test 的 module,
ngMock 裡面提供到 global 的 function 有三個:
- dump
協助你在 test 的時候可以 print 出 AngularJS 相關 context 的內容
- module
插入一段 configuration phase 的程式碼,也可以用來指定 module dependency
- inject
好用的 injector function,方便你在需要的時候叫出某 service