本文介绍了一个轻量级的 JavaScript Mock 类实现,用于模拟函数行为并统计调用次数。通过 setup、returnAs 等方法构建模拟对象,并结合 QUnit 框架进行单元测试,验证特定函数在特定场景下的执行次数与状态变化,适用于前端开发中的依赖模拟与逻辑验证。
JavaScript Mock 类核心实现
代码示例如下:
(function () {
var KMock = window.KMock = function () {
}
KMock.prototype.setup = function (methodName) {
var instance = this;
instance[methodName] = {
returnAs: function (fn) {
instance["_" + methodName] = function () {
instance[methodName].invokeNum++;
fn.call();
}
},
isVerify: function (exceptNum) {
if (exceptNum != null) {
return exceptNum == instance[methodName].invokeNum;
}
else {
return instance[methodName].invokeNum > 0;
}
},
invoke: function () {
instance["_" + methodName].call();
},
invokeNum: 0
};
return instance[methodName];
}
})();
基于 QUnit 的单元测试应用示例// 自定义Mock类,用于模拟函数并验证调用次数,具体用法如下
<BR><DIV class=cnblogs_Highlighter><PRE class=brush:javascript>/// <reference path="Flight.js" />
/// <reference path="http://demo.jb51.net/jslib/qunit/qunit.js" />
/// <reference path="KMock.js" />
module("enter coin");
test("enter coin while game has not yet start", function () {
var flight = new KFlight();
var mock = new KMock();
mock.setup("draw").returnAs(function () {
});
flight.draw = mock.draw.invoke;
equal(flight.coinNum, 0);
equal(flight.gameState, 0);
flight.coinEnter();
equal(flight.coinNum, 0);
equal(flight.gameState, 1);
equal(mock.draw.isVerify(1), true);
});