Sencha touch 開發中使用Jasmine 進行功能測試

對於Jasmine,我就不多做介紹了。可以去官網看看 http://pivotal.github.com/jasmine/

Sencha touch(以下簡稱ST)目前雖然有些bug,但是不影響項目的使用,因爲我們只是利用了其部分的提供的特性與其UI部分。而個人感覺比較好的就是mixin,之前openlaszlo也是支持mixin,所以基本相差無幾。在開發的過程中,目前做單元測試,比較不好做的,應該就是javascript。雖然也有jsunit,jasmine,dojo doh等等一些第三方的測試框架,但是相對來說,需求上還是無法滿足自己想要的簡單便利,或者就是複雜的邏輯或者過程,寫單元測試會比較麻煩,對於很多剛接觸javascript的員工,更是顯得有點吃力了。

我選擇jasmine,主要是因爲ST的組也是在用。而且看了它的一些單元測試,包括去仔細研究了一下jasmine,發現這個玩意不錯。就此引入項目。

在寫這個簡單的例子之前呢,我得對ExtJS的mixin做個基本的介紹。我們知道高級語言裏邊有Interface,像java,爲了增強某些類的功能,或者是很多類可能擁有某些共有的功能,就只能通過抽象出接口來實現。javascript沒有接口的概念,所以ExtJS引入了mixin.但它其實不是真實的接口。就是能增強某個類行爲。很多人或許說,ExtJS Class System不是有繼承麼。但是我們要知道,對於一個類,實現單一繼承遠遠是不夠的。我們舉例他們Component源碼:

Ext.define('Ext.Component', {

    extend: 'Ext.AbstractComponent',

    alternateClassName: 'Ext.lib.Component',

    mixins: ['Ext.mixin.Traversable'],

    ...
});

從上面可以看到,component繼承的類爲Ext.AbstractComponent,同時,它又擁有了Ext.mixin.Traversable類提供的方法接口。如果只用繼承的話,是很難做到這一點的。

而且ExtJS引入了pureMVC,使用了到了常見的一些設計模式,比如controller,也是採用mixin的方式,來達到此類目的,


Ext.define('Ext.app.Controller', {
    alternateClassName: 'Ext.Application',
    
    mixins: {
        observable: 'Ext.util.Observable'
    },
  ...

});

更多詳細的內容,大家可以去看看其部分源碼。

回到我們的主題,下面我像大家展示是如何做基本的測試的,首先定義自己的類,它是一個singleton,

Ext.define('Ext.util.HashUtil', {
    statics: {
        getInstance: function() {
            if (!this.instance) {
                this.instance = new this();
            }

            return this.instance;
        },

        setInstance: function(instance) {
            this.instance = instance;

            return this;
        }
    },
    
 ...
});

那麼下面測試其是否是一個單例,jasmine代碼如下:首先得定義我們自己的matchers(https://github.com/pivotal/jasmine/wiki/Matchers):

beforeEach(function() {
  this.addMatchers({
    isSingleton: function(instance){
        var currentInstance = this.actual;
        return instance === currentInstance;
    }
  });
});

第二步,寫下我們的當前類的測試組

describe("HashUtil", function() {
    var hashUtil;
    
    beforeEach(function() {
        hashUtil = Ext.util.HashUtil.getInstance();
    });


    it("HashUtil should be a singleton", function() {
        var hashUtil0 = Ext.util.HashUtil.getInstance();
        expect(hashUtil).toBe(hashUtil0);
    });

...
});

然後就可以進行測試了。測試結果圖:









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章