[英]How to have a real atomic test in QUnit?
假設我有兩個名為Book
and Library
類,如下所示:
var Book = function(title, author)
{
this.title = title;
this.author = author;
};
和
var Library = function()
{
var dbName = 'test';
this.getLibrary = function() {
return JSON.parse(window.localStorage.getItem(dbName));
};
this.save = function(library) {
window.localStorage.setItem(dbName, JSON.stringify(library));
};
}
Library.prototype.addBook = function(book) {
var library = this.getLibrary();
library.push(book);
this.save(library);
return library;
};
Library.prototype.removeBook = function(book) {
var library = this.getLibrary();
// Find and delete the right book
this.save(library);
return library;
};
我的問題是:如何使用QUnit對Library
類進行單元測試以進行真正的原子和獨立測試?
我寫了這個測試功能,但它並沒有讓我滿意。 它似乎不是非常原子和獨立的,因為它混合了我認為應該獨立測試的幾個函數。 我想知道是否有更好的方法,或者我已經測試好了。
test("test", function() {
var library = new Library();
deepEqual(library.getLibrary(), []);
// Add book1
var book1 = new Book("A book", "An author");
deepEqual(library.addBook(book1), [book1]);
deepEqual(library.getLibrary(), [book1]);
// Add book2
book2 = new Result("A new book", "Another author");
deepEqual(library.addBook(book2), [book2, book1]);
deepEqual(library.getLibrary(), [book2, book1]]);
// Remove book1
deepEqual(library.removeResult(book1), [book2]);
deepEqual(library.getLibrary(), [book2]);
// Remove book2
deepEqual(library.removeResult(book2), []);
deepEqual(library.getLibrary(), []);
});
避免編寫依賴於您正在測試的單元的內部狀態的“綜合”測試。 對特定行為進行細粒度測試,而不是說明:
test("addBooksReturnsLibrary", function(){
var l = new Library();
l.addBook(new Book(...));
l.addBook(new Book(...));
var addBooksRetval = l.addBook(new Book(...));
deepEqual(addBooksRetval, l.getLibrary();
});
test("libraryContainsAddedBook"), function() {
var l = new Library();
var b = new Book(...);
l.addBook(b);
notEqual(-1, library.indexOf(b));
});
// etc and so forth
大量使用deepEqual
似乎更像是一種測試氣味。 如果您確實需要按照特定順序在圖書館中存放圖書,我會說最好特別針對這些訂購限制進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.