5

次のように andという 2 つのクラスがあるBookLibraryします。

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;
};

私の質問は次のとおりです: LibraryQUnitを使用してクラスをユニットテストして、実際のアトミックで独立したテストを行うにはどうすればよいですか?

このテスト関数を書きましたが、満足できませんでした。独立してテストする必要があると思われるいくつかの機能が混在しているため、非常にアトミックで独立しているようには見えません。より良い方法があるかどうかを知りたいのですが、すでにうまくテストしています。

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(), []);
});
4

1 に答える 1

3

テストしているユニットの内部状態に依存する「オムニバス」テストを書くことは避けてください。次の状態ではなく、特定の動作についてきめ細かいテストを行います。

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、ほとんどの場合、においのテストのようです。たとえば、書籍を特定の順序でライブラリに配置する必要がある場合は、これらの順序の制約を具体的にテストすることをお勧めします。

于 2012-10-09T00:31:09.350 に答える