Mocha: MockMozActivity與global Leak

- - posted in javascript | Comments

之前在寫單元測試時,需要測到MozActivity的呼叫。

當我們嘗試去取代window object中的MozActivity時,會遇到:

1
0) Feed "before all" hook: Error: global leak detected:

解決方法:

在程式前面加上mocha.setup({ignoreLeaks: true});

最後加上mocha.setup({ignoreLeaks: true});

碰到這個錯誤是在嘗試加入假的MozActivity給window時。

因為要被測試的module中有如下的程式片段:

1
2
3
4
  new MozActivity({
    name: 'view',
    data: { type: 'url', url: url }
  });

去呼叫browser app開啟某個特定網頁,

但是mocha跑的環境中有可能:

  1. 並沒有window.MozActivity這個物件。
  2. 有MozActivity但是我們無法知道他是否被呼叫。

這時候需要塞一個MockMozActivity給window,暫時取代掉原本的MozActivity,

然後從MockMozActivity裡面留個變數記錄被呼叫的參數狀況來判斷程式是否正確的執行呼叫activity。

1
2
3
4
5
6
7
8
9
10
11
'use strict';

var mockMozActivityInstance = null;

var MockMozActivity = function MozActivity(configuration) {
  for (var property in configuration) {
    this[property] = configuration[property];
  }
  mockMozActivityInstance = this;
  return this;
};

之後寫的測試內容:

1
2
3
4
5
6
// Captive Portal Test
  test('system/captive portal login w/o manual enable wifi', function() {
    CaptivePortal.handleEvent(event);
    MockSettingsListener.mCallback(true);
    assert.equal(mockMozActivityInstance.name, 'view');
  });

人生第一個單元測試程式完成 \O/

Comments