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