和其它的框架一樣,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.hmoore.net/kongrp/angularjsguide/181089](http://www.hmoore.net/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
- 第十四章:重構服務層