2015-04-03 13 views
14

Tôi là một newbie liên quan đến tất cả mọi thứ javascript, Node.js, mocha, vvPhạm vi biến hoạt động như thế nào trong khung kiểm tra Mocha?

Trong mã của tôi, tôi có một đối tượng đơn vị mà có một disable() mà bộ tài sản tàn tật là true và isDisabled() trả về giá trị tài sản khuyết tật . Nó cũng có phương thức nextTurnReset() để đặt lại đơn vị vào đầu lượt tiếp theo. Tôi đã viết một bộ thử nghiệm để kiểm tra hành vi này. Lần đầu tiên tôi vô hiệu hóa đối tượng và sau đó thử kiểm tra xem nó có bị vô hiệu hay không. Tuy nhiên, biến đơn vị bên trong thử nghiệm đầu tiên của tôi - nằm trong hàm ẩn danh được chuyển tới phương thức it() của Mocha - đang ở trạng thái không bị vô hiệu hóa như tôi đã quan sát với trình gỡ lỗi của nút.

describe('#disable()', function() { 
    var unit = tests.newUnit(); 
    unit.disable(); 
    debugger; 
    it('disabled off turn?', function() { 
     debugger; 
     (unit.isDisabled()).should.be.exactly(true); 
    }); 
    unit.nextTurnReset(); 
    it('disabled on next turn?', function() { 
     (unit.isDisabled()).should.be.exactly(true); 
    }); 
    unit.nextTurnReset(); 
    it('disabled on 2nd turn?', function() { 
     (unit.isDisabled()).should.be.exactly(false); 
    }); 
}); 

cho bản ghi, hai thử nghiệm đầu tiên không thành công và thử nghiệm cuối cùng cho thấy thiết bị không bao giờ bị tắt.

từ việc sử dụng trình gỡ lỗi của trình gỡ lỗi nút: Sau câu lệnh debugger; đầu tiên, unit.disabled == true, nhưng sau câu lệnh debugger; thứ hai unit.disabled == false. Tôi hy vọng giá trị đúng trong cả hai trường hợp.

Bất kỳ ý tưởng nào về lý do này? Ngoài ra, cách chính xác để viết các bài kiểm tra Mocha để đạt được kết quả mong đợi của tôi là gì?

Cảm ơn bạn rất nhiều!

Trả lời

12

Phạm vi biến trong Mocha hoàn toàn giống với bất kỳ mã JavaScript nào khác. Vấn đề của bạn là bạn không nhận ra trong đó thứ tự Mocha sẽ thực thi mã của bạn. Đây là những gì sẽ xảy ra:

  1. Bạn tạo bản sao đơn vị và gọi disable trên đó.

  2. Bạn đăng ký bài kiểm tra đầu tiên của mình. Đó là những gì it thực hiện: nó đăng ký kiểm tra để thực hiện tương lai. Thử nghiệm hiện không thực hiện.

  3. Bạn gọi số unit.nextTurnReset(); để đặt lại trạng thái đối tượng của bạn.

  4. Bạn đăng ký bài kiểm tra thứ hai của mình. Một lần nữa nó không thực hiện bây giờ.

  5. Bạn đặt lại đối tượng của mình một lần nữa.

  6. Bạn đăng ký bài kiểm tra cuối cùng của mình.

Sau này, Mocha thực hiện các kiểm tra bạn đã đăng ký và chạy chúng. Vào thời điểm thử nghiệm đang chạy đối tượng của bạn đang ở trạng thái đặt lại, không bị tắt.

Dường như với tôi rằng cho hành vi mong muốn bạn mô tả, mã của bạn nên là:

describe('#disable()', function() { 
    var unit = tests.newUnit(); 

    beforeEach(function() { 
     unit.nextTurnReset(); 
    }); 

    it('disabled off turn?', function() { 
     unit.disable(); 
     (unit.isDisabled()).should.be.exactly(true); 
    }); 

    it('disabled on next turn?', function() { 
     (unit.isDisabled()).should.be.exactly(false); 
    }); 
}); 

Mã truyền cho beforeEach được thực hiện trước mỗi bài kiểm tra bạn đã đăng ký để nó reset đối tượng tại đúng thời điểm.

0

Việc chuyển trạng thái giữa các ví dụ không phải là cách thực hành tốt. Điều gì sẽ xảy ra nếu bạn cần chạy thử nghiệm theo thứ tự ngẫu nhiên? Hoặc ai đó trong dự án quyết định di chuyển các ví dụ xung quanh?

Đối với tôi có hai ví dụ sau đây có vẻ là đủ để kiểm tra Unit # vô hiệu hóa đúng

describe('#disable()', function() { 
    it('gets disabled when called on an enabled', function() { 
     var unit = tests.newUnit(); 
     unit.disable(); 

     (unit.isDisabled()).should.be.exactly(true); 
    }); 

    it('gets enabled when called on a disabled', function() { 
     var unit = tests.newUnit(); 
     unit.disable(); 
     unit.disable(); 

     (unit.isDisabled()).should.be.exactly(false); 
    }); 
}); 
+1

Các OP đã làm nó sai, nhưng đặt một vật cố đến một trạng thái đã biết giữa các xét nghiệm là một chiến lược hoàn toàn hợp lệ. Nếu việc tạo ra toàn bộ vật cố không phải là hợp lý, tôi thích tạo ra nó một lần nữa trong mỗi bài kiểm tra, nhưng đôi khi tốt hơn là đặt lại trạng thái đã biết giữa bài kiểm tra thay vì tạo các đồ đạc đắt tiền một lần nữa. Gọi 'unit.nextTurnReset()' trong một hook 'beforeEach' đặt lại fixture thử nghiệm thành một trạng thái đã biết * giữa * tests. Vì nó nằm trong hook 'beforeEach', lời gọi tới' unit.nextTurnReset() 'trước mỗi test không phụ thuộc vào các test chạy hoặc không chạy, hoặc kiểm tra thứ tự. – Louis

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