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);
    });

...
});

然后就可以进行测试了。测试结果图:









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