免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3643 | 回复: 0
打印 上一主题 下一主题

Rails 3 中使用jasmine 测试Javascript [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-21 14:01 |只看该作者 |倒序浏览
转:iseesea

Rails 3 中使用jasmine 测试Javascript



虽然测试js代码很恶心;但是要测试,特别是写很多js的时候;
在一个项目中,使用jasmine来测试我们一个需要很多很多js代码的页面;对于那个页面,我都觉得都已经写了一个Js的UI了。。。。当初没有用现成的JS UI框架,真是失误啊~
Jasmine is a behavior-driven development framework for testing your JavaScript code. It does not depend on any other JavaScript frameworks. It does not require a DOM. And it has a clean, obvious syntax so that you can easily write tests.
这是jasmine的介绍;
项目链接:http://pivotal.github.com/jasmine/index.html

测试代码结构是:
Javascript代码
  1. describe("Jasmine", function() {   
  2.   it("makes testing JavaScript awesome!", function() {   
  3.     expect(yourCode).toBeLotsBetter();   
  4.   });   
  5. });  
复制代码
很有rspec的风格;开始用它(Rails3);
第一步:

gem "jasmine"
添加到项目的特定环境组里;
然后运行
Ruby代码
  1. $ bundle install   
  2. $ bundle exec jasmine init  
复制代码
上面第二行是初始化 jasmine,他会在项目目录底下产生一些测试例子,供我们参考:
在 public/javascripts/中产生 player和song的js文件。
在spec/中产生 javascripts 文件夹,里面有一些测试例子;
我们写的测试代码就是放在这个文件夹底下;
第二步:
运行
Ruby代码
  1. rake jasmine
复制代码
然后点击打开http://localhost:8888可以查看自动生成的测试代码运行的结果
第三步:
配置文件在 spec/javascripts/suport/jasmine.yml
可以在里面配置包含要测试的目标js文件,css文件,测试文件存放目录等一些配置;
在spec/javascripts/helpers/里面我们可以自定义一些matcher的方法,比如里面自动产生的示例:toBePlaying方法;
第四步:开始编写测试代码;下面贡献一个我的例子:
js的功能代码
Javascript代码
  1. function matchFail_user(it){
  2.      $(it).next().val('');
  3.      var n = $(it).parent().next();
  4.     while(n.attr("class") == 'auto_clean'){
  5.         wipe_clean([n.children("input:first").attr('id')]);
  6.         n = n.next();
  7.     }
  8. }
复制代码
js功能的测试代码:
Javascript代码
  1. describe('matchFail_user',function(){

  2.     afterEach(function (){
  3.       $("#workspace").remove();
  4.     });


  5.     it('set project hidden empty and wipe clean current row', function() {
  6.         $("body").append("<div id='workspace'></div>");
  7.         workspace = $("#workspace");
  8.         workspace.html("<tr><td><input id='log_entry_1_log_time'></input><input type='text' value='stud' id='projects_iterations_1'></input><input id='project_hidden' type='hidden' value='58'></input></td><td class='auto_clean'><input id='child' type='text' value='king' /></td></tr>");
  9.         bind_autocomplete('child', {});
  10.         project = $("#projects_iterations_1").get();
  11.         project_hidden = $("#projects_iterations_1").next();
  12.         spyOn(window,"wipe_clean");
  13.         
  14.         matchFail_user(project)
  15.         expect(project_hidden.val()).toEqual("");
  16.         expect(window.wipe_clean).toHaveBeenCalledWith([$(project).parent().next().children("input:first").attr('id')]);


  17.     });

  18.   });
复制代码
Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks.
在这个jasmine里面的spy很经常用,比如可以如下使用:
Javascript代码
  1. var Klass = function () {
  2. };

  3. Klass.staticMethod = function (arg) {
  4.   return arg;
  5. };

  6. Klass.prototype.method = function (arg) {
  7.   return arg;
  8. };

  9. Klass.prototype.methodWithCallback = function (callback) {
  10.   return callback('foo');
  11. };

  12. ...

  13. describe("spy behavior", function() {
  14.   it('should spy on a static method of Klass', function() {
  15.     spyOn(Klass, 'staticMethod');
  16. //创建一个监视Klass.staticMethod的监视器,理论上这个是不会有返回值的,因为被拦截了,它可以使用    spyOn(Klass, 'staticMethod').andReturn("result")的方法替它返回结果,也有类似的比如andCallThrough之类的方法来真正实现这个功能;
  17.     Klass.staticMethod('foo argument');

  18.     expect(Klass.staticMethod).toHaveBeenCalledWith('foo argument');
  19.   });

  20.   it('should spy on an instance method of a Klass', function() {
  21.     var obj = new Klass();
  22.     spyOn(obj, 'method');
  23.     obj.method('foo argument');

  24.     expect(obj.method).toHaveBeenCalledWith('foo argument');

  25.     var obj2 = new Klass();
  26.     spyOn(obj2, 'method');
  27.     expect(obj2.method).not.toHaveBeenCalled();
  28.   });

  29.   it('should spy on Klass#methodWithCallback', function() {
  30.     var callback = jasmine.createSpy();
  31.     new Klass().methodWithCallback(callback);

  32.     expect(callback).toHaveBeenCalledWith('foo');
  33.   });
  34. });
复制代码
虽然测试js很恶心,但也要测,终于写完了这些测试。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP