Làm việc trên nhiều phần mở rộng chrome tôi đã đưa ra sinon-chrome
dự án cho phép để chạy đơn vị xét nghiệm sử dụng mocha
, nodejs
và phantomjs
.
Về cơ bản, nó tạo ra các giả lập sinon của tất cả các chrome.*
API nơi bạn có thể đặt bất kỳ phản hồi json nào được xác định trước.
Tiếp theo, bạn tải tập lệnh của mình bằng cách sử dụng nút vm.runInNewContext
cho trang nền và phantomjs
để hiển thị trang bật lên / tùy chọn.
Và cuối cùng, bạn khẳng định rằng api chrome được gọi với các đối số cần thiết.
Hãy lấy một ví dụ:
Giả sử chúng ta có tiện ích chrome đơn giản hiển thị số lượng tab đã mở trong huy hiệu nút.
trang nền:
chrome.tabs.query({}, function(tabs) {
chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
Để kiểm tra nó, chúng ta cần:
- giả
chrome.tabs.query
để trả về phản hồi được xác định trước, ví dụ hai tab.
- tiêm
chrome.*
api giả của chúng tôi vào một số môi trường
- chạy mã mở rộng của chúng tôi trong môi trường này
- khẳng định rằng huy hiệu nút bằng '2'
Đoạn mã sau:
const vm = require('vm');
const fs = require('fs');
const chrome = require('sinon-chrome');
// 1. mock `chrome.tabs.query` to return predefined response
chrome.tabs.query.yields([
{id: 1, title: 'Tab 1'},
{id: 2, title: 'Tab 2'}
]);
// 2. inject our mocked chrome.* api into some environment
const context = {
chrome: chrome
};
// 3. run our extension code in this environment
const code = fs.readFileSync('src/background.js');
vm.runInNewContext(code, context);
// 4. assert that button badge equals to '2'
sinon.assert.calledOnce(chrome.browserAction.setBadgeText);
sinon.assert.calledWithMatch(chrome.browserAction.setBadgeText, {
text: "2"
});
Bây giờ chúng ta có thể gói nó vào các describe..it
chức năng của mocha và chạy từ thiết bị đầu cuối:
$ mocha
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
Bạn có thể tìm thấy ví dụ đầy đủ ở đây .
Ngoài ra, sinon-chrome cho phép kích hoạt bất kỳ sự kiện chrome nào với phản hồi được xác định trước, ví dụ:
chrome.tab.onCreated.trigger({url: 'http://google.com'});