Javascript 如何在昆特进行真正的原子测试?
假设我有两个类,分别称为Javascript 如何在昆特进行真正的原子测试?,javascript,unit-testing,qunit,Javascript,Unit Testing,Qunit,假设我有两个类,分别称为Book和Library,如下所示: var Book = function(title, author) { this.title = title; this.author = author; }; 及 我的问题是:如何使用QUnit对库类进行单元测试,以进行真正的原子独立测试 我编写了这个测试函数,但它没有让我满意。它似乎不是非常原子化和独立的,因为它混合了几个我认为应该独立测试的函数。我想知道是否有更好的方法,或者我已经在测试了 test("test"
Book
和Library
,如下所示:
var Book = function(title, author)
{
this.title = title;
this.author = author;
};
及
我的问题是:如何使用QUnit对库
类进行单元测试,以进行真正的原子独立测试
我编写了这个测试函数,但它没有让我满意。它似乎不是非常原子化和独立的,因为它混合了几个我认为应该独立测试的函数。我想知道是否有更好的方法,或者我已经在测试了
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
似乎更像是一种测试气味。如果您确实需要,比如说,图书以特定的顺序存放在图书馆中,我认为最好专门测试这些顺序限制。这一点很好。但我的主要问题是,要测试removeBook,例如,我必须依赖addBook。我如何处理这个问题?@user1730232这不是一个真正的问题。添加/删除功能不是正交的。只需测试所有情况:删除而不添加失败。删除并添加0个元素。等@user1730232单个类的操作不能完全独立。事实上,如果是这样的话,那将是一种代码味道——这表明类承担了太多的责任。如果你想对此非常正式,我想你可以制作一些测试图表来分析行为之间的依赖关系,并使它不只是由周期组成。但是一般来说,你可以假设一个类的实现是“正常的”,并且没有专门编写代码来通过测试套件,而不是无用的,然后编写测试来检测回归等等。
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