🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
和其它的框架一样,C层同样不是指挥官,它只是东指挥一下,西指挥一下,并不负责数据运算与逻辑处理。本教程我们的重点仍然是javaee,所以在此,我们更多的给出代码供参考。 # 新建teacher模型 `$ yo angular:service teacher` 命令执行后,将我们新建如下两个文件: ``` create app/scripts/services/teacher.js create test/spec/services/teacher.js ``` # 增加all方法 app/scripts/services/teacher.js ``` 'use strict'; /** * @ngdoc service * @name webAppApp.teacher * @description * # teacher * Service in the webAppApp. */ angular.module('webAppApp') .service('teacher', function() { // Public API here return { // 获取考场编排信息 all: function(callback) { var teachers = [ { name: '张三', username: 'zhangsan', sex: 0, email: 'zhangsan@yunzhiclub.com' }, { name: '李四', username: 'lisi', sex: 1, email: 'lisi@yunzhiclub.com' } ]; callback(teachers); }, }; }); ``` 在这里,我们使用了回调函数。这也是js里常见的方法。在这里,我们必须使用回调函数,以保障后期顺利的与后台对接。 > 回调函数:[http://www.kancloud.cn/kongrp/angularjsguide/181089](http://www.kancloud.cn/kongrp/angularjsguide/181089) 在开启grunt serve的前提后,当我们对文件保存后,grunt会自动为我们检查代码的输出是否正确,是否规范等信息。 # 单元测试 我们以前说:我们在M层中,每新建一个方法,都需要进行单元测试。angularjs也不例外。 下面,让们使用karma来开启第一个单元测试。 yoman在建立teacher.js的同时,在test文件夹的相同位置,为我们建立好了对应的测试文件。 我们找到test/spec/services/teacher.js,并键入以下内容: ``` ... it('应该取出来所有的教师数据', function() { var teachers; teacher.all(function (data){ teachers = data; console.log('取出数据如下:'); console.log(teachers); // 检测tachers的长度,如果为2,正确,则不报错。 expect(teachers.length).toBe(2); // 检测teachers的第一个元素的用户名是否为zhangsan expect(teachers[0].username).toBe('zhangsan'); // 测试一个错误的结果,假设我们期待返回的数组长度为1 expect(teachers.length).toBe(1); }); }); ... ``` 增加代码后: ``` 'use strict'; describe('Service: teacher', function() { // load the service's module beforeEach(module('webAppApp')); // instantiate service var teacher; beforeEach(inject(function(_teacher_) { teacher = _teacher_; })); it('should do something', function() { expect(!!teacher).toBe(true); }); it('应该取出来所有的教师数据', function() { var teachers; teacher.all(function (data){ teachers = data; console.log('取出数据如下:'); console.log(teachers); // 检测tachers的长度,如果为2,正确,则不报错。 expect(teachers.length).toBe(2); // 检测teachers的第一个元素的用户名是否为zhangsan expect(teachers[0].username).toBe('zhangsan'); // 测试一个错误的结果,假设我们期待返回的数组长度为1 expect(teachers.length).toBe(1); }); }); }); ``` 保存文件后,测试自动执行,结果: ``` LOG: '取出数据如下:' LOG: [Object{name: '张三', username: 'zhangsan', sex: 0, email: 'zhangsan@yunzhiclub.com'}, Object{name: '李四', username: 'lisi', sex: 1, email: 'lisi@yunzhiclub.com'}] PhantomJS 2.1.1 (Mac OS X 0.0.0) Service: teacher 应该取出来所有的教师数据 FAILED Expected 2 to be 1. test/spec/services/teacher.js:30:41 all@app/scripts/services/teacher.js:20:25 test/spec/services/teacher.js:20:20 loaded@http://localhost:8080/context.js:151:17 PhantomJS 2.1.1 (Mac OS X 0.0.0): Executed 5 of 5 (1 FAILED) (0 secs / 0.039 secPhantomJS 2.1.1 (Mac OS X 0.0.0): Executed 5 of 5 (1 FAILED) (0.009 secs / 0.039 secs) Warning: Task "karma:unit" failed. Use --force to continue. Aborted due to warnings. ``` 我们看到,shell中,打印出了log信息。当取出的数组长度与我们期待的不同时,报出了我们在测试文件中,定义的错误。并且给出了出错位置的具体信息。 最后,我们去除最后的冗余的测试信息, 测试通过。 去除冗余信息后,代码如下: ``` 'use strict'; describe('Service: teacher', function() { // load the service's module beforeEach(module('webAppApp')); // instantiate service var teacher; beforeEach(inject(function(_teacher_) { teacher = _teacher_; })); it('should do something', function() { expect(!!teacher).toBe(true); }); it('应该取出来所有的教师数据', function() { var teachers; teacher.all(function(data) { teachers = data; // 检测tachers的长度,如果为2,正确,则不报错。 expect(teachers.length).toBe(2); // 检测teachers的第一个元素的用户名是否为zhangsan expect(teachers[0].username).toBe('zhangsan'); }); }); }); ```