2012-10-09 25 views
5

Nói rằng tôi đã hai lớp gọi BookLibrary như sau:Làm thế nào để có một thử nghiệm nguyên tử thực sự trong QUnit?

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

Câu hỏi của tôi là: Làm thế nào tôi có thể kiểm tra đơn vị lớp Library sử dụng QUnit để có một nguyên tử thực tế và kiểm tra độc lập?

Tôi đã viết chức năng kiểm tra này nhưng nó không thỏa mãn tôi. Nó không có vẻ rất nguyên tử và độc lập vì nó kết hợp nhiều chức năng mà tôi nghĩ nên được kiểm tra độc lập. Tôi muốn biết nếu có một cách tốt hơn hoặc tôi đang thử nghiệm nó tốt rồi.

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

Trả lời

3

Tránh viết các kiểm tra "omnibus" phụ thuộc vào trạng thái nội bộ của đơn vị bạn đang thử nghiệm. Thực hiện các thử hạt mịn cho cụ hành vi, không nhà nước:

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 

sử dụng nặng của deepEqual có vẻ như đó là một thử nghiệm mùi thường xuyên hơn không. Nếu bạn cần, nói rằng, những cuốn sách để được trong thư viện theo một thứ tự cụ thể, tôi muốn nói nó là tốt hơn để kiểm tra cho những ràng buộc đặt hàng cụ thể.

+0

Điểm tốt. Nhưng vấn đề chính mà tôi có là để kiểm tra removeBook, ví dụ, tôi phải dựa vào addBook. Làm thế nào tôi có thể đối phó với điều này? – user1730232

+1

@ user1730232 Đó không phải là một vấn đề thực sự. Thêm/xóa chức năng không trực giao. Chỉ cần kiểm tra tất cả các trường hợp: Xóa mà không thêm lỗi. Loại bỏ với thêm lá 0 yếu tố. Vv – Bringer128

+1

@ user1730232 Các hoạt động của một lớp đơn lẻ không thể hoàn toàn độc lập. Thực tế, nó sẽ là một mùi mã nếu chúng là - một dấu hiệu cho thấy lớp học có quá nhiều trách nhiệm. Nếu bạn muốn được * rất * chính thức về điều này, tôi cho rằng bạn có thể làm một số loại đồ thị của các bài kiểm tra của bạn để phân tích sự phụ thuộc giữa các hành vi, và làm cho nó không chỉ bao gồm các chu kỳ. Nhưng nói chung, bạn có thể giả định rằng việc triển khai lớp là "lành mạnh" và không được mã hóa cụ thể để vượt qua bộ kiểm thử khi đang vô dụng và viết các bài kiểm tra để phát hiện các phép hồi quy, vv thay thế. – millimoose

Các vấn đề liên quan