和其它的框架一样,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');
});
});
});
```
- README
- 第一章:准备
- 第二章:Hello World!
- 第一节:查看工程文件
- 第二节:JDK、JRE与环境变量
- 第三节:index.jsp
- 第三章:Hello Struts
- 第一节:Web.xml
- 第二节:单入口
- 第三节:Hello Struts
- 第四节:触发C层
- 第四章:建立数据表
- 第一节:建立实体类
- 第二节:测试一
- 第三节:测试二
- 第四节:引入Hibernate
- 第五节:配置Hibernate
- 第六节:建立连接
- 第七节:实体类映射数据表
- 第八节:完善数据表
- 第五章:教师管理
- 第一节:增加数据--add
- 第二节:增加数据--save
- 1 获取传入数据数据
- 2 数据写入测试
- 3 对接C层
- 第三节:数据列表
- 1 获取数据
- 2 重构代码
- 3 C层对接--初始化
- 4 C层添加数据
- 5 V层显示数据
- 6 获取数据库中数据
- 7 显示性别
- 8 分页
- 9 条件查询
- 第四节:修改数据
- 1 edit
- 2 update
- 第五节:删除数据
- 第六节:总结
- 第六章:重构C层
- 第一节:继承ActionSupport类
- 第二节:数据验证
- 第七章:前台分离(前台)
- 第一节:环境搭建
- 第二节:运行环境
- 第三节:共享开发环境
- 第四节:生产环境
- 第八章:前台开发(前台)
- 第一节:本地化
- 第二节:教师列表
- 1 引入M层
- 2 模拟后台返回数据
- 3 C与M对接
- 4 C与V对接
- 第九章:前后台对接(前后台)
- 第一节:后台输出json(后台)
- 第二节:对接前台(全栈)
- 第二节:对接API(前台)
- 第二节:跨域请求(后台)
- 第三节:重构代码(前台)
- 第十章:重构后台M层
- 第一节:数据访问DAO层
- 第二节:项目整体重构
- 第十一章:用户登陆(前后台)
- 第一节:制定规范
- 第二节:定制测试用例
- 第三节:后台输入测试代码(后台)
- 第四节:postman(后台)
- 第五节:新建用户登陆模块(前台)
- 第六节:代码重构(前台)
- 第十二章:班级管理(前后台)
- 第一节:班级列表
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第二节:Add
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第三节:Save
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第四节:Edit
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第五节:Update
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第六节:Delete
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第七节:小结
- 第十三章:班级管理(API)
- 第一节:ER图
- 第二节:create
- 1 实体层
- 2 dao层
- 3 service(server)层
- 4 action层
- 第三节:ManyToOne
- 第四节:Read
- 1 service(server)层
- 2 action层
- 第五节:update
- 1 service(server)层
- 2 action层
- 第六节:update
- 第十四章:重构服务层