2011-08-11 38 views
9

Tôi đang cố gắng tạo một bộ thử nghiệm cho một mô-đun mà tôi đang viết trong Node.js bằng Nodeunit. Mô-đun là danh sách phát nhạc cơ bản cho phép thêm và xóa các bản nhạc vào danh sách phát.Nodeunit test.throws dường như không gặp lỗi

var playlist = function(){ 
    this.__playlist = []; 
    this.__count = 0; 
}; 

playlist.prototype = { 
    addtrack:function(track){ 
     if(typeof track !== "object") throw new Error("Track needs to be an oject"); 
     this.__count++; 
     track.id = this.__count; 
     this.__playlist.push(track); 
     return this.__playlist; 
    }, 
    removetrack:function(trackid){ 
     if(typeof trackid !== "number") throw new Error("Pass in a numeric track id"); 
     var trackFound = false; 
     for(var i=0;i<this.__playlist.length;i++){ 
      var t = this.__playlist[i]; 
      if(t.id == trackid){ 
       trackFound = true; 
       this.__playlist.splice(i,1); 
      } 
     } 
     if(!trackFound) throw new Error("Track not found in the playlist"); 
     return this.__playlist 
    } 
} 

exports.playlist = function(){ 
    return new playlist(); 
} 

Như bạn có thể thấy có những nơi mà ném lỗi dựa trên dữ liệu không chính xác được thông qua tại.

Vì vậy, đây là bộ kiểm tra của tôi.

var pl = require('./playlist'); 

exports.testPlaylistInit = function(test){ 
    var playlist = pl.playlist(); 
    test.equal(typeof playlist, 'object'); 
    test.done(); 
} 

exports.testAddingTracks = function(test){ 
    var playlist = pl.playlist(); 
    test.throws(playlist.addtrack(), Error, 'Should fail for blank track'); 
    var track = { 
     title: "Golly Sandra", 
     artist: "Eisley", 
     album: "Room Noises" 
    }; 
    tracks = playlist.addtrack(track); 
    test.equals(tracks[0],track); 
    test.equals(tracks[0].id,1) 
    test.done(); 
} 

exports.testRemoveingTracks = function(test){ 
    var playlist = pl.playlist(); 
    test.throws(playlist.removetrack('Imma error'), Error, 'Show fail for non-numeric track id'); 
    var track = { 
     title: "Golly Sandra", 
     artist: "Eisley", 
     album: "Room Noises" 
    }; 
    playlist.addtrack(track); 
    track = { 
     title: ".44 Calliber Love Letter", 
     artist: "Alexisonfire", 
     album: "Alexisonfire" 
    } 
    playlist.addtrack(track); 
    test.equals(playlist.removetrack(1)[0],track); 
    test.throws(playlist.removetrack(10), Error, 'Should fail for non-existant track'); 
    test.done(); 
} 

Trong khi viết bộ kiểm tra tôi đã sử dụng test.throws như giả thiết về cơ bản chỉ kết thúc tốt đẹp các khối mã trong một tuyên bố try-catch và kiểm tra đánh bắt so với khối lỗi. Rõ ràng tôi là sai mặc dù, bởi vì khi tôi chạy thử nghiệm với Nodeunit, Node hiển thị thông báo lỗi được ném bởi các mô-đun thay vì bộ thử nghiệm bắt lỗi. Tôi có đang sử dụng trường hợp test.throw không chính xác không?

Trả lời

23

Việc sử dụng test.throws của bạn không hoàn toàn đúng. Nếu bạn nhìn vào những gì bạn có:

test.throws(
    playlist.removetrack('Imma error'), 
    Error, 
    'Show fail for non-numeric track id' 
); 

Bạn đang thực hiện playlist.removetrack('Imma error'), và sau đó đi qua các kết quả đó để ném, vì vậy nếu có một ngoại lệ, nó sẽ xảy ra trước khi ném được bao giờ thực hiện.

Bạn nên làm một cái gì đó như thế này:

test.throws(
    function() { 
    playlist.removetrack('Imma error'); 
    }, 
    Error, 
    'Show fail for non-numeric track id' 
); 

Bạn phải vượt qua trong một chức năng, mà khi được thực thi, sẽ cố gắng để loại bỏ các đường đua. Bằng cách đó, logic danh sách phát của bạn thực sự được thực thi bởi hàm ném và do đó có thể tự động được bao bọc trong khối try/catch.

+3

hoàn hảo, vàng .... có lẽ ví dụ tương tự sẽ được thêm vào readme cho nodeunit;) –

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