開發完M層,下面,我們開始將CM進行對接.
# C層
app/scripts/controllers/teacher/index.js
```
'use strict';
/**
* @ngdoc function
* @name webAppApp.controller:TeacherIndexCtrl
* @description
* # TeacherIndexCtrl
* Controller of the webAppApp
*/
angular.module('webAppApp')
.controller('TeacherIndexCtrl', function ($scope, teacher) {
// 使用回調函數來獲取數據
teacher.all(function(teachers) {
$scope.teachers = teachers;
});
});
```
保存。
但是。。。。好像shell并沒有監測到我們的文件發生了變化,也沒有為我們自動查錯。
這是,由于我們在`controllers`文件夾增加了子文件夾,而`yoman`的設計是:把所有的控制器全部寫在`controllers`文件夾中。在小型的項目中,這樣做是可以的。但考慮到以后我們可能會涉及一些與權限控制相關的中型項目,我們認為每一個`action`對應一個控制器更有利于分工。
如果還需要`grunt`為我們自動檢測代碼,并且自動測試的話,那么我們需要如下配置`gruntfile.js`.
<hr />
> 以下內容修改原文件較多,修改前需要做好備份
步驟如下:
1. 打開`gruntfile.js`
2. 查找`/scripts/{`關鍵字, 并選中
3. 按ctrl + d 選中所有的字段。
4. 將其更改為`/scripts/**/{`
用同樣的方法,將`spec/{` 更改為: `spec/**/{`
保存后,執行ctrl+c,然后再執行`grunt serve`來重新啟動服務。
去除示例代碼及示例單元測試代碼,以防報錯。
> 在團隊開發中,我們的核心成員將完成項目的初始化工作。所以如果前面你感覺學習有些吃力,那么大可以跳過。我們在github中,已經為大家準備好修改后可用的gruntfile.js文件。
## 單元測試
原則上,由于我們在C層中直接調用了M層的方法。而我們在開發C層時,又假設了兩點:1.M層已經開發完畢,并按我們的需求進行了單元測試。2.M層是由其它團隊人員開發的。所以,C層在進行單元測試時,是不需要對調用的M層的方法進行測試的。
所以在只有以上代碼的前提下,是不需要進行單元測試的。事實上,我們在進行程序開發時,C層的作用僅是調用調用這個,調用調用那個。是個指揮官,而不進行邏輯運算。所以在這種假設的前提下,C層的重點在于不能出現語法錯誤。我們的grunt又十分人性化的在代碼保存時,提示我們語法是否出錯。所以,在M層開發比較給力的前提下,C層的代碼量則會少很多。
在此,我們為了鞏固上一小節中的模擬$http請求的內容,模擬進行M層的調用,給出以下測試代碼,供選學。
<hr />
test/spec/controllers/teacher/index.js
完整代碼:
```
'use strict';
describe('Controller: TeacherIndexCtrl', function() {
// load the controller's module
beforeEach(module('webAppApp'));
var TeacherIndexCtrl,
scope, $httpBackend;
// Initialize the controller and a mock scope
beforeEach(inject(function($controller, $rootScope, _$httpBackend_) {
scope = $rootScope.$new();
$httpBackend = _$httpBackend_;
// 定義請求 URL
var url = 'resource/teacher/index/all.json';
// 定義返回數據。注意此處的json數據的寫法與xxx.json文件中的json數據的寫的法的異同。
var data = {
teachers: [
{ username: 'zhangsan', name: '張三', sex: 0, email: 'zhangsan@yunzhiclub.com' },
{ username: 'lisi', name: '李四', sex: 1, email: 'lisi@yunzhiclub.com' },
{ username: 'wangwu', name: '王五', sex: 0, email: 'wangwu@yunzhiclub.com' }
]
};
// 進行模似數據請求配置.當請求方法為GET,資源名為resource/teacher/index/all.json, 返回data數據.
$httpBackend.when('GET', url).respond(data);
TeacherIndexCtrl = $controller('TeacherIndexCtrl', {
$scope: scope
// place here mocked dependencies
});
}));
it('測試M層的靜態數據', function() {
// 模擬數據請求
$httpBackend.flush();
// 期望:返回的數組長度為3
expect(scope.teachers.length).toBe(3);
});
});
```
保存后,shell不報錯,修改并測試成功.
- 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
- 第十四章:重構服務層