2017-12-14 152 views
9

Chúng tôi có một codebase thử nghiệm khá lớn (khoảng 10.000 dòng mã javascript) và trong một số trường hợp, chúng ta cần phải biến thước đo-to-kiễu góc đồng bộ hóa off:Làm thế nào để không quên biến Protractor thành Angular sync trên một lần nữa?

browser.ignoreSynchronization = true; 

Nhưng, vấn đề là, theo thời thời gian chúng ta quên bật đồng bộ hóa lại làm cho tất cả các thử nghiệm tiếp theo thất bại với những lý do không rõ ràng đòi hỏi thời gian và công sức để gỡ lỗi.

Có cách nào để đảm bảo đồng bộ hóa được bật lại trong thử nghiệm không?

Chúng tôi có phân tích mã tĩnh dựa trên ESLint và thực hiện đánh giá mã.

+1

Có thể viết hàm bao bọc, ví dụ: 'withoutSync (() => {...})' tắt nó lúc bắt đầu và trở lại vào cuối - điều này sau đó có thể quấn toàn bộ các callbacks mong đợi hoặc chỉ một phần của chúng. Sau đó, bạn chỉ đặt thuộc tính trực tiếp trong một hàm đó. – jonrsharpe

+0

@jonrsharpe hm, giống như một "người quản lý ngữ cảnh", ý tưởng hay, tôi thích nó. Đôi khi, mặc dù chúng tôi cần phải có nó cho một số 'it()' s trong một hàng .. cảm ơn. – alecxe

+0

Sử dụng webdriverio để thay thế. Sau đó, bạn không phải lo lắng về nó. Trong tất cả các mức độ nghiêm trọng, đây là lý do chính xác tôi chuyển từ thước đo sang wdio. Khi khung của bạn trở nên lớn, nó trở thành một cơn ác mộng để theo dõi thời điểm đồng bộ hóa được bật hay không. Theo kinh nghiệm của tôi, tôi thực sự kết thúc với ít mã hơn khi tôi di cư. – tehbeardedone

Trả lời

9

Tôi chỉ làm afterTest móc (phụ thuộc vào người chạy thử nghiệm của bạn), nơi tôi đặt tất cả mọi thứ trở về trạng thái bắt đầu của nó, vì vậy nếu tôi thậm chí quên để chuyển đổi trở lại trong thử nghiệm, hoặc thử nghiệm bị rơi vì một lý do nào đó trên bất kỳ điểm nào - các thử nghiệm tiếp theo sẽ không bị ảnh hưởng:

Mã của tôi cho hoa nhài. Cấu hình thước đo góc:

onPrepare() { 
    ... 
    afterEach(function() { 
    // Setting ignoreSychronization back to true, in case it was changed in tests 
    browser.waitForAngularEnabled(true); 
    // Setting back to default frame. In case test was working in iframe 
    browser.switchTo().defaultContent(); 

    // This depends on your architecture. We do clean run for each test. 
    browser.manage().deleteAllCookies(); 
    browser.executeScript('window.sessionStorage.clear(); window.localStorage.clear();').then(
     undefined, 
     function (err) { 
      // Errors will be thrown when browser is on default data URL. 
      // Session and Local storage is disabled for data URLs 
      // This callback is needed to not crash test, and just ignore error. 
     }); 

    browser.manage().timeouts().implicitlyWait(5000); // I even rewrite implicit wait back to default value, in case i touched it in tests 

    // Also you might want to clear indexdb storage after tests. 
    }) 

Trong mã thực, tôi sẽ bọc nó vào hàm resetBrowser hoặc một cái gì đó như thế này. Ngoài ra bạn có thể trả lại lời hứa từ nó, và sau đó trả lại lời hứa đó từ móc - vì vậy kiểm tra mới sẽ không bắt đầu cho đến khi lời hứa được giải quyết

+1

Ôi trời ơi, một 'afterEach' toàn cầu có lẽ là ý tưởng hay nhất cho đến nay. Cảm ơn, Хотабыч! – alecxe

4

Tại một thời điểm khi tôi đang đấu tranh với cùng một kịch bản này, tôi đã tạo ra một hàm trợ giúp và gọi nó trước khi tôi điều hướng đến một trang mới. Bạn vẫn phải "nhớ" để gọi hàm nhưng ít nhất điều này chỉ cung cấp cho bạn một vị trí trong mã mà bạn đang xử lý thay đổi đó.

isAngularSite(flag) { 
    browser.ignoreSynchronization = !flag; 
} 

Và trong mã của tôi, tôi gọi nó là như utils.isAngularSite(false);

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