Unit Test - $componentController

Angular1.5+ 的component語法很贊, 但是對它們做單元測試時難住了我.

指令的測試向來比較繁瑣, 需要$compile拿到element, 在通過element得到controller.

beforeEach(angular.mock.inject($injector => {
    $compile = $injector.get('$compile');
    $rootScope = $injector.get('$rootScope');
    scope = $rootScope.$new();
    element = $compile(`
        <input name="tel" ng-model="tel" type="tel"/>
    `)(scope);
    $rootScope.$apply();
    controller = element.controller('ngModel');
}));

雖然component是directive的語法糖, 但是它的測試卻有點不太一樣, 在component doc 中提到了一個$componentController服務(wù), 它包含在ngMock中, 這個服務(wù)的優(yōu)點在于你可以不用創(chuàng)建DOM元素就能測試controller.

Component測試實例

假設(shè)有如下Component

export const FormRenderComponent = {
    template,
    controller,
    bindings: {
        data:   '<',
        name:   '@',
        onSave: '&'
    }
};

---Magic Is Here---

為了拿到該組件的控制器, 代碼非常簡單.

let $componentController, controller;
let bindings = {
    data:   [],
    name:   'form name',
    onSave: angular.noop
};
beforeEach(angular.mock.inject($injector => {
    $componentController = $injector.get('$componentController');
    controller = $componentController('formRender', null, bindings);
}));

$componentController的第一個參數(shù)就是需要測試的組件名, 通過.component注冊在模塊上的, 第二個參數(shù)是locals可以用來提供$scope, $attr, $element, 第三個參數(shù)是bindings的值. 如需更詳細(xì)的描述請查閱官方文檔. 如果你locals幾個對象全用上了, 變得很復(fù)雜, 建議還是用$compile的方式拿controller.

.component('formRender', FormRenderComponent)

測試代碼就就隨意發(fā)揮了, 舉個簡單的例子, 測試bindings的數(shù)據(jù)是否賦值成功.

it('bindings should work', () => {
    expect(controller.data).toEqual(bindings.data);
    expect(controller.name).toEqual(bindings.name);
});

不要忘了$onInit()

如果你的組件實現(xiàn)了$onInit生命周期函數(shù), 進(jìn)行測試的時候必須確保手動調(diào)用, $ 否則不會觸發(fā).

it('$onInit() should init data and events', () => {
    spyOn(controller, 'initData');
    spyOn(controller, 'initEvents');
    controller.$onInit();
    expect(controller.initData).toHaveBeenCalled();
    expect(controller.initEvents).toHaveBeenCalled();
});

為了代碼的質(zhì)量和可讀性, 單元測試是必須的, 如果你還沒有養(yǎng)成寫單元測試的習(xí)慣, 那就從現(xiàn)在開始吧.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,008評論 25 709
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,490評論 2 7
  • Angular面試題 一、ng-show/ng-hide與ng-if的區(qū)別? 第一點區(qū)別是,ng-if在后面表達(dá)式...
    w_zhuan閱讀 5,706評論 0 26
  • 這兩天懶惰的什么都不想做。感賞也沒寫。 看到群里趙芳對家長耐心的引導(dǎo),層層提問,抽絲剝繭剖析挖掘最深處的原因。兩天...
    小石印兒閱讀 352評論 0 7

友情鏈接更多精彩內(nèi)容