2013-02-25 59 views
17
  1. Tôi có một ứng dụng web sử dụng window.applicationCache để truy cập ngoại tuyến .
  2. Tất cả mã của tôi quản lý appCache (ví dụ: kiểm tra/cập nhật/hoán đổi bộ nhớ cache) được đóng gói thành đối tượng "bộ điều khiển bộ nhớ cache" .
  3. Tôi có các bài kiểm tra đơn vị để kiểm tra các chức năng "bộ điều khiển bộ nhớ cache" của mình. Để thử nghiệm, tôi tạm thời thay thế đối tượng window.applicationCache gốc bằng phiên bản của riêng tôi (vì tôi chỉ muốn thử nghiệm của mình, chứ không phải trình duyệt triển khai appCache), ví dụ:Giả lập đối tượng cửa sổ chung trong require.js

    window.applicationCache = { /* my appCache mock */ }; 
    // unit tests run here. Code under test references window.applicationCache. 
    

Một thời gian trước (khoảng. Chrome 16) phương pháp này làm việc một cách hoàn hảo. Sau đó Chrome 17, trên cả hai nền tảng Windows & của Windows, đã xóa khả năng vá trên thuộc tính window.applicationCache mặc định của trình duyệt (trong khi tò mò, nó vẫn hoạt động tốt trong Chrome dành cho Linux cho tất cả các phiên bản và bao gồm Chrome 26). Vào thời điểm đó, tôi logged a Chromium bug cho việc này; nhưng tiếc là báo cáo lỗi vẫn được liệt kê là 'chưa được xác nhận'.

Dù sao, tôi vừa chuyển ứng dụng từ 'globals browser' truyền thống (tức là tải các tệp * .js thông qua thẻ script; tất cả các đối tượng JS là toàn cục) vào mô-đun kiểu AMD, sử dụng bộ nạp mô-đun require.js.

Một trong những lợi ích của AMD (hoặc CommonJS) là tiêm phụ thuộc, nơi mã của bạn nhận được tham chiếu địa phương địa phương cho bất kỳ đối tượng phụ thuộc nào, thay vì dựa vào tham chiếu toàn cục.

require(['foo'], function(Foo) { 
    var bar = new Foo(); 
}); 

... mà làm cho nó dễ dàng để làm đối tượng chế nhạo, vì bạn có thể cấu hình bộ nạp mô-đun để vượt qua một đối tượng giả cho 'foo' khi ở chế độ thử nghiệm. Tôi đã hy vọng rằng bằng cách chuyển sang tiêm phụ thuộc, tôi có thể gặp vấn đề applicationCache của tôi (khi tham chiếu 'window' được chuyển vào các mô-đun của tôi có thể là đối tượng cửa sổ toàn cục hoặc đối tượng giả).

Tuy nhiên, tôi không chắc làm cách nào để require.js tiêm 'cửa sổ' làm phụ thuộc vào các mô-đun của tôi?

Có thể (có thể sử dụng shim config?) Để xác định mô-đun 'cửa sổ'; mà sau đó có thể được chuyển đến bất kỳ mã nào hoạt động trên đối tượng 'cửa sổ' chung? Để tôi có thể làm một việc như sau:

require(['???'], function(window) { 
    // 'window' here is the real window object, or for testing it's a mock window object 
    window.applicationCache.update(); 
}); 

... trong đó '???' là tên mô-đun đề cập đến đối tượng cửa sổ.

Hoặc tôi có cần xác định mô-đun của riêng mình xuất 'cửa sổ', có thể ánh xạ khác nhau để thử nghiệm đơn vị, ví dụ:

// window.js 
define(function() { 
    return window; // real global window object 
}); 

// window-mock.js 
define(function() { 
    return { 
    applicationCache: { /* mock version of appCache */ } 
    } 
}); 

// for unit testing, remap 'window' to the mock version 
require.config({ 
    map: { 
    "cache-controller": { 
     "window": "window-mock" 
    } 
    } 
}); 

// cache-controller.js 
require(['window'], function(window) { 
    window.applicationCache.update(); 
}); 

Trả lời

6

Tôi đã trả lời câu hỏi của riêng mình. Tôi quyết định tạo các mô-đun window.js và window-mock.js như được mô tả ở trên, cho phép tôi chuyển phiên bản giả khi chạy kiểm tra đơn vị và sử dụng đối tượng cửa sổ 'thực' khi chạy bình thường.

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