2015-10-26 32 views
6

Tôi đang thử nghiệm ứng dụng góc cạnh của mình với Thước đo góc. Khi người dùng đăng nhập vào ứng dụng của tôi, tôi đặt $ timeout để thực hiện công việc trong một giờ (vì vậy nếu người dùng đăng nhập vào 13:00, thời gian chờ $ sẽ chạy lúc 14:00). tôi tiếp tục nhận được những thất bại:

"Timed out waiting for Protractor to synchronize with the page after 20 seconds. Please see https://github.com/angular/protractor/blob/master/docs/faq.md. The following tasks were pending: - $timeout: function onTimeoutDone(){....." 

Tôi đã đọc trang timeout này: https://github.com/angular/protractor/blob/master/docs/timeouts.md vì vậy tôi hiểu thước đo chờ đợi cho đến khi trang được nạp đầy đủ có nghĩa là anh ấy chờ đợi $ timeout để hoàn thành ...

Làm thế nào tôi có thể làm cho thước đo không chờ đợi cho rằng $ timeout? Tôi không muốn sử dụng:

browser.ignoreSynchronization = true; 

Bởi vì sau đó thử nghiệm của tôi sẽ thất bại vì những lý do khác (thành phần góc cạnh khác vẫn cần thời gian để tải ...)

+1

Bạn đã thử xả hết thời gian chờ đó thông qua thử nghiệm của mình ngay sau khi cài đặt chưa? – MBielski

Trả lời

3

Các giải pháp sẽ tuôn ra tích cực timeouts (as @MBielski mentioned it in comments), nhưng bản gốc phương pháp tuôn ra bản thân chỉ có sẵn trong anuglar-mocks. Để sử dụng trực tiếp-mocks trực tiếp, bạn sẽ phải bao gồm nó trên trang như một thẻ <script> và bạn cũng sẽ phải đối phó với tất cả ghi đè nó tạo ra, nó tạo ra rất nhiều tác dụng phụ. Tôi đã có thể tái tạo tuôn ra mà không sử dụng mock góc cạnh bằng cách nghe bất kỳ timeouts nào được tạo và sau đó đặt lại chúng theo yêu cầu.

Ví dụ, nếu bạn có một thời gian chờ trong ứng dụng Góc của bạn:

$timeout(function() { 
    alert('Hello World'); 
}, 10000); // say hello in 10 sec 

Xét nghiệm này sẽ trông giống như:

it('should reset timeouts', function() { 

    browser.addMockModule('e2eFlushTimeouts', function() { 

     angular 
     .module('e2eFlushTimeouts', []) 
     .run(function ($browser) { 

      // store all created timeouts 
      var timeouts = []; 

      // listen to all timeouts created by overriding 
      // a method responsible for that 
      var originalDefer = $browser.defer; 

      $browser.defer = function (fn, delay) { 
       // originally it returns timeout id 
       var timeoutId = originalDefer.apply($browser, arguments); 
       // store it to be able to remove it later 
       timeouts.push({ id: timeoutId, delay: delay }); 
       // preserve original behavior 
       return timeoutId; 
      }; 

      // compatibility with original method 
      $browser.defer.cancel = originalDefer.cancel; 

      // create a global method to flush timeouts greater than @delay 
      // call it using browser.executeScript() 
      window.e2eFlushTimeouts = function (delay) { 
       timeouts.forEach(function (timeout) { 
        if (timeout.delay >= delay) { 
         $browser.defer.cancel(timeout.id); 
        } 
       }); 
      }; 

     }); 

    }); 


    browser.get('example.com'); 

    // do test stuff 

    browser.executeScript(function() { 
     // flush everything that has a delay more that 6 sec 
     window.e2eFlushTimeouts(6000); 
    }); 

    expect(something).toBe(true); 
}); 

Nó kinda thực nghiệm, tôi không chắc chắn nếu nó sẽ làm việc cho trường hợp của bạn. Mã này cũng có thể được đơn giản hóa bằng cách di chuyển browser.addMockModule sang mô-đun node.js riêng biệt. Ngoài ra có thể có vấn đề nếu bạn muốn loại bỏ thời gian chờ ngắn (như 100ms), nó có thể hủy bỏ hiện đang chạy các quy trình Góc, do đó thử nghiệm sẽ bị hỏng.

+0

giải pháp tốt đẹp. Tuy nhiên, nếu tôi hiểu chính xác, giải pháp này sẽ hủy tất cả thời gian chờ, vì vậy tôi không thể kiểm tra xác nhận trong khi hết thời gian chờ. – BiAiB

+0

@BiAiB, Thời gian chờ chỉ bị hủy khi bạn gọi phần 'browser.executeScript (...) ', tôi tin rằng bạn có thể xác nhận trước và sau đó giết hết thời gian chờ nếu cần. Có thể đặt phần 'browser.executeScript (...)' trong 'afterEach' cũng sẽ hoạt động. –

0

Giải pháp là sử dụng trình chặn và sửa đổi yêu cầu http đang hết thời gian chờ và đặt thời gian chờ tùy chỉnh thành một số mili giây (mong muốn) của bạn thành yêu cầu http sao cho sau một thời gian dài yêu cầu http sẽ bị đóng (vì thời gian chờ mới) và sau đó bạn có thể kiểm tra phản ứng ngay lập tức.

Điều này hoạt động tốt và đầy hứa hẹn.

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