创建空白的笔记
接下来,我们开始创建一个空白笔记的界面。界面的设计草图如下所示:

我们可以通过BDD测试描述这个行为,在测试用例中,添加如下代码:
it("Returns a blank note", function () {
var blankNote = Notes.dataContext.createBlankNote();
expect(blankNote.title.length === 0).toBeTruthy();
expect(blankNote.narrative.length === 0).toBeTruthy();
});
var blankNote = Notes.dataContext.createBlankNote();
expect(blankNote.title.length === 0).toBeTruthy();
expect(blankNote.narrative.length === 0).toBeTruthy();
});
如果我们现在运行这个测试,测试结果肯定不能通过,因为没有将createBlankNote方法添加到DataContext的测试模块中,修改后的代码如下:
Notes.dataContext = (function () {
var notesList = [];
function createBlankNote() {
var dateCreated = new Date();
var id = new String(dateCreated.getTime()) + new String(getRandomInt(0, 100));
var noteModel = new Notes.NoteModel({
id: id,
dateCreated: dateCreated,
title: "",
narrative: ""
});
return noteModel;
}
function getNotesList() {
return notesList;
}
return {
createBlankNote: createBlankNote,
getNotesList: getNotesList
};
})();
var notesList = [];
function createBlankNote() {
var dateCreated = new Date();
var id = new String(dateCreated.getTime()) + new String(getRandomInt(0, 100));
var noteModel = new Notes.NoteModel({
id: id,
dateCreated: dateCreated,
title: "",
narrative: ""
});
return noteModel;
}
function getNotesList() {
return notesList;
}
return {
createBlankNote: createBlankNote,
getNotesList: getNotesList
};
})();
在上面的代码中,会发现其中调用了getRandomInt这个助手类方法,它的作用是在创建新的记事时生成其id编号,由于我们还没编写getRandomint这个方法,所以运行测试时,可以看到是如下的出错界面:

接下来我们编写getRandomint的代码,如下:
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
return Math.floor(Math.random() * (max - min + 1)) + min;
}
再次运行测试后,依然发现有错误,这次的错误是说我们还没定义NoteModel类的实例,接下来我们在应用目录中创建NoteModel.js文件,代码如下:
Notes.NoteModel = function (id, dateCreated, title, narrative) {
this.id = id;
this.dateCreated = dateCreated;
this.title = title;
this.narrative = narrative;
}
this.id = id;
this.dateCreated = dateCreated;
this.title = title;
this.narrative = narrative;
}
所有的跟记事相关的操作都必须使用到这个类的实例,包括将记事缓存在移动设备中(用到的是将该类的实例的一个序列化)。
我们同样要在specrunner.html中,加上对NoteModel.js的引用,如下:
<!-- App --><script type="text/javascript" src="app/DataContext.js"></script>
<script type="text/javascript" src="app/NoteModel.js"></script>
<script type="text/javascript" src="app/NoteModel.js"></script>
再次运行测试,可以看到这次测试结果运行正确了,如下图:
