karma作为jQuery单元测试Runner

karma作为angular测试runner出现,如果你使用过karma一定感受到这很不错的javascript测试runner。简单干净的配置文件karma.config.js,以及karma init一些快捷的配置command。以及整套测试套件,如html2js,coverage。对于angular单元测试karma就是一个全生态的测试套件,能够简洁快速的搭建整个测试流程。

本文将尝试运用karma作为jQuery单元测试runner。对于jQuery这种DOM操作的框架,有时难于分离view逻辑,以及ajax这种外部资源的mock,所以比较难于实施对jQuery程序的TDD开发。

jasmime测试套件

对于jasmine测试框架为了解决这些问题有两个插件jasmine-jquery和jasmine-ajax。

jasmine-jquery

jasmine-jQuery主要解决加载测试所需的DOM元素,为单元测试构建前置环境。jasmine-jQuery加载DOM方法:

jasmine.getFixtures().fixturesPath = ‘base path‘;
loadFixtures(‘myfixture.html‘);
jasmine.getFixtures().load(...);

这里的loadFixtures需要真实ajax获取html fixtures所以我们需要提前host html fixtures。jasmine-jQuery还框架了一些有用的matchers,如toBeChecked, toBeDisabled, toBeFocused,toBeInDOM……

jasmine-ajax

jasmine-ajax则是对于一般ajax测试的mock框架,其从底层xmlhttprequest实施mock。所以让我们能偶很容易实施对于jQuery的$.ajax,$.get…mock。如

beforeEach(function() {
    jasmine.Ajax.requests.when = function (url) {
      return this.filter("/jquery/ajax")[0];
    };
    jasmine.Ajax.install();
});

it("jquery ajax success with getResponse", function() {
    var result;

    $.get("/jquery/ajax").success(function(data) {
        result = data;
    });

    jasmine.Ajax.requests.when("/jquery/ajax").response({
      "status": 200,
      "contentType": ‘text/plain‘,
      "responseText": ‘data from mock ajax‘
    });

    expect(result).toEqual(‘data from mock ajax‘);
});

afterEach(function() {
    jasmine.Ajax.uninstall();
});

对于jasmine-ajax是实施mock之前一定需要jasmine.Ajax.install(),以及测试完成后需要jasmine.Ajax.uninstall();jasmine-ajax在install后会把所有的ajax mock掉,所以如果有需要真实ajax的需要在install之前完成,如jasmine-jQuery加载view loadFixtures。

运用karma runner

我们已经了解了jasmine测试的两个框架jasmine-jQuery和jasmine-ajax,所以运用karma作为runner,我们需要解决的问题就是把他们和karma集成在一起。

所以分为以下几步: 1:karma中引入jasmine-jQuery和jasmine-ajax(可以利用bowerinstall) 2:host 测试的html fixtures。 3:加载html fixtures 与install ajax之前。

对于host 文件karma提供了pattern模式,所以karma配置为:

files: [
    {
      pattern: ‘view/**/*.html‘,
      watched: true,
      included: false,
      served: true
    },
    ‘bower_components/jquery/dist/jquery.js‘,
    ‘bower_components/jasmine-jquery/lib/jasmine-jquery.js‘,
    ‘bower_components/jasmine-ajax/lib/mock-ajax.js‘,
    ‘src/*.js‘,
    ‘test/*.js‘
],

这里需要注意karma自带的jasmine是低版本的,所以我们需要npm install [email protected]获取最新的karma-jasmine插件。

我们就可以完成了karma的配置,我们可以简单测试我们的配置:demo on github.

测试html fixtures加载:

describe(‘console html content‘, function() {

  beforeEach(function() {
    jasmine.getFixtures().fixturesPath = ‘base/view/‘;
    loadFixtures("index.html");
  });

  it(‘index html‘, function() {
    expect($("h2")).toBeInDOM();
    expect($("h2")).toContainText("this is index page");
  });

})

测试mock ajax:

describe(‘console html content‘, function() {

  beforeEach(function() {
     jasmine.Ajax.requests.when = function(url) {
         return this.filter("/jquery/ajax")[0];
     };
     jasmine.Ajax.install();
 });

  it(‘index html‘, function() {
    expect($("h2")).toBeInDOM();
    expect($("h2")).toContainText("this is index page");
  });

  it("ajax mock", function() {
    var doneFn = jasmine.createSpy("success");

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(args) {
      if (this.readyState == this.DONE) {
        doneFn(this.responseText);
      }
    };

    xhr.open("GET", "/some/cool/url");
    xhr.send();

    expect(jasmine.Ajax.requests.mostRecent().url).toBe(‘/some/cool/url‘);
    expect(doneFn).not.toHaveBeenCalled();

    jasmine.Ajax.requests.mostRecent().response({
      "status": 200,
      "contentType": ‘text/plain‘,
      "responseText": ‘awesome response‘
    });

    expect(doneFn).toHaveBeenCalledWith(‘awesome response‘);
  });

  it("jquery ajax success with getResponse", function() {
    var result;
    getResponse().then(function(data){
      result = data;
    });

    jasmine.Ajax.requests.when("/jquery/ajax").response({
      "status": 200,
      "contentType": ‘text/plain‘,
      "responseText": ‘data from mock ajax‘
    });

    expect(result).toEqual(‘data from mock ajax‘);
  });

  it("jquery ajax error", function() {
    var status;
    $.get("/jquery/ajax").error(function(response) {
      status = response.status;
    });

    jasmine.Ajax.requests.when("/jquery/ajax").response({
      "status": 400
    });

    expect(status).toEqual(400);
  });

  afterEach(function() {
    jasmine.Ajax.uninstall();
  });
})      

更多请参见demo on github.

时间: 2024-09-30 04:38:05

karma作为jQuery单元测试Runner的相关文章

在vue-cli生成的项目中使用karma+chrome进行单元测试

用vue-cli生成项目时,如果选择了单元测试,那么会采用karma+mocha作为单元测试框架,默认使用的浏览器是PhantomJs. Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner).可启动所有主流Web浏览器作为测试容器,运行时会启动一个web服务器,生成包含js源代码和js测试脚本的测试页面,运行浏览器加载测试页面,并显示测试的结果. mocha是一款JavaScript测试框架,提供一套函数来帮助编写测试用例,并通过运行执行测试并得

使用karma+jasmine做单元测试

目的 使用karma和jasmine来配置自动化的js单元测试. Karma和Jasmine Karma是由Angular团队所开发的一种自动化测试工具.链接:http://karma-runner.github.io/ Karma会启动PhantomJS实例来运行测试,可以在其上使用Jasmine.Mocha等测试框架,也可以和Jenkins.Travis等CI(Continuous Integration,持续集成)进行整合. Jasmine是一个按照BDD(behavior-driven

Karma和Jasmine自动化单元测试

前言 在Java领域,Apache, Spring, JBoss 三大社区的开源库,包罗万象,但每个库都在其领域中都鹤立鸡群.而Nodejs中各种各样的开源库,却让人眼花缭乱,不知从何下手. Nodejs领域: Jasmine做单元测试,Karma自动化完成单元测试,Grunt启动Karma统一项目管理,Yeoman最后封装成一个项目原型模板,npm做nodejs的包依赖管理,bower做javascript的包依赖管理.Java领域:JUnit做单元测试, Maven自动化单元测试,统一项目管

结合angularjs,Karma和Jasmine自动化单元测试

前言 在Java领域,Apache, Spring, JBoss 三大社区的开源库,包罗万象,但每个库都在其领域中都鹤立鸡群.而Nodejs中各种各样的开源库,却让人眼花缭乱,不知从何下手. Nodejs领域: Jasmine做单元测试,Karma自动化完成单元测试,Grunt启动Karma统一项目管理,Yeoman最后封装成一个项目原型模板,npm做nodejs的包依赖管理,bower做javascript的包依赖管理. Java领域:JUnit做单元测试, Maven自动化单元测试,统一项目

自动化单元测试(Karma + Mocha)

使用 Karma + Mocha做单元测试 Karma([?kɑrm?] 卡玛)是一个测试运行器,它可以呼起浏览器,加载测试脚本,然后运行测试用例 Mocha([?mo?k?] 摩卡)是一个单元测试框架/库,它可以用来写测试用例 Sinon(西农)是一个 spy / stub / mock 库,用以辅助测试(使用后才能理解) 安装各种工具 npm i -D karma karma-chrome-launcher karma-mocha karma-sinon-chai mocha sinon s

必看的 jQuery性能优化的38个建议 (转)

一.注意定义jQuery变量的时候添加var关键字 这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下: $loading = $('#loading'); //这个是全局定义,不知道哪里位置倒霉引用了相同的变量名,就会郁闷至死的 二.请使用一个var来定义变量 如果你使用多个变量的话,请如下方式定义: .代码如下: varpage = 0,    $loading = $('#loading'),    $body = $('body'); 不要给每

Jquery学习--性能优化建议

一.选择器性能优化建议 1. 总是从#id选择器来继承 这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了. 1 $('#content').hide(); 或者从ID选择器继承来选择多个元素: 1 $('#content p').hide(); 2. 在class前面使用tag jQuery中第二快的选择器就是tag选择器(如$(‘head’)),因为它和直接来自于原生的Javascript方法getElementByTagName().所以最好总是用t

jQuery 优化

一.选择器性能优化建议 1. 总是从#id选择器来继承 这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了. $('#content').hide(); 或者从ID选择器继承来选择多个元素: $('#content p').hide(); 2. 在class前面使用tag jQuery中第二快的选择器就是tag选择器(如$(‘head’)),因为它和直接来自于原生的Javascript方法getElementByTagName().所以最好总是用tag来修

jquery优化28个建议

我一直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将最好最常用的一些优化性能的建议列出来.我也做了一个jQuery性能优化的简明样式表,你可以打印出来或者设为桌面背景. 一.选择器性能优化建议 1. 总是从#id选择器来继承 这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了. 1 $('#content').hide(); 或者从ID选择器继承来选择多个元素: 1 $('#content p')