2014-08-27 14 views
5

Tôi nhận được kết quả kỳ lạ với người giúp đỡ thử nghiệm của Ember andThenclick. Theo documentation Ember của:Vấn đề thử nghiệm tích hợp Ember.JS với andThen và nhấp vào người trợ giúp

các andThen helper sẽ đợi cho tất cả những người giúp đỡ không đồng bộ trước để hoàn thành trước khi tiến về phía trước.

Tuy nhiên, tôi thấy điều này dường như không phải lúc nào cũng đúng. Trong ví dụ bên dưới, có 3 câu hỏi console.debug. Tôi sẽ mong đợi họ được đăng nhập theo thứ tự A -> B -> C. Tuy nhiên, tôi luôn nhận được thứ tự này: A -> C -> B. Tôi chỉ có thể nhận được thứ tự ABC dự kiến ​​khi tôi chỉ sử dụng 1 trong hai lần nhấp người giúp đỡ. Không có trình xử lý sự kiện (hành động) nào được liên kết với phần tử <div> được tham chiếu trong trình trợ giúp nhấp chuột.

Mọi người có thể giải thích hành vi bất ngờ này không? Có lỗi trong việc tôi sử dụng những người trợ giúp không? Hoặc một lỗi với khung kiểm tra của Ember?

andThen(function() { 
    console.debug('mark A'); 

    click('div:first'); // with just 1 click helper, debug order is ABC 
    click('div:first'); // with this second click helper, debug order is ACB 

    andThen(function() { 
     console.debug('mark B'); 
    }); 
}); 

andThen(function() { 
    console.debug('mark C'); 
}); 

Sửa:

Dựa trên câu trả lời được đưa ra bởi Kingpin2k, tôi đã kết thúc theo đuổi các giải pháp sau đây để có được phong cách kiểm tra tôi đang tìm kiếm.

Trước tiên, tôi đã tạo một trình trợ giúp thử nghiệm không đồng bộ có tên next. Thứ hai, tôi đã thay thế tất cả những người trợ giúp andThen trong mã của mình bằng số người trợ giúp tùy chỉnh next. Điều này cho phép mã của tôi chạy theo thứ tự tôi mong đợi.

// test-helper.js 
Ember.Test.registerAsyncHelper('next', function(app, fn) { 
    fn(); 
}); 

// my-integration-test.js 
next(function() { 
    console.debug('mark A'); 

    click('div:first'); 
    click('div:first'); 

    next(function() { 
     console.debug('mark B'); 
    }); 
}); 

next(function() { 
    console.debug('mark C'); 
}); 

Trả lời

5

andThen chỉ là đường cú pháp cho lastPromiseEmberSawCreated.then như vậy thực sự nó trông như thế này:

lastPromiseEmberSawCreated.then(function(){ 
    console.debug('mark A'); 

    click('div:first'); // with just 1 click helper, debug order is ABC 
    click('div:first'); // with this second click helper, debug order is ACB 

    nextLastPromiseEmberSawCreated.then(function() { 
     console.debug('mark B'); 
    }); 
}); 

// the promise won't have changed in between these two `andThen` calls 
// because Ember had no cpu time, and you didn't make any additional calls 

lastPromiseEmberSawCreated.then(function(){ 
    console.debug('mark C'); 
}); 
+1

lời giải thích của bạn là khác với những gì tôi đã hiểu căn cứ vào tài liệu tại http://emberjs.com/guides/ kiểm tra/thử nghiệm-người trợ giúp/# toc_wait-người trợ giúp. Nhưng lời giải thích của bạn có ý nghĩa và đưa tôi đến giải pháp mà tôi đã mô tả trong bài đăng đã chỉnh sửa. – jake

+1

Đó là một chút ẩn, nhưng nó ngụ ý trong tuyên bố này 'Lưu ý và sau đó có một đối số duy nhất của hàm có chứa mã để thực thi sau khi các trình trợ giúp thử nghiệm khác đã hoàn thành.', nhưng câu lệnh này' Trình trợ giúp và sau đó sẽ đợi tất cả trước đó những người trợ giúp không đồng bộ để hoàn thành trước khi tiến lên phía trước.' là gây hiểu nhầm, thực sự bạn cần phải đọc chúng cùng nhau để có một tuyên bố chính xác. Nó thực sự có nghĩa là mã được chèn vào sẽ không thực thi cho đến khi lời hứa toàn cầu hiện tại hoàn thành, nhưng nó sẽ tiếp tục với mã bên ngoài và sau đó. – Kingpin2k

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