最近在给 CoAP框架 加测试,以保证代码是正常工作的,分享一下Sinon与Jasmine的SpyOn方法的使用。
有这样两个关于spy的方法
一个Spy能监测任何function的调用和获取其参数。
以及
Spy方法可以用来模拟函数的执行,以达到隔离复杂依赖的效果。
Spy应该是归到mock方法的。也就是在这种情况下,我期望方法A()能在带这样或那样的参数的调用。Mock记录并验证这样的期望。
Standalone test spies, stubs and mocks for JavaScript. No dependencies, works with any unit testing framework.
用于JavaScritp的独立测试spies, stubs和mocks的框架。 不依赖于其他框架,可以和其他测试框架一起工作。
so,看看官方给的一个例子
it("calls the original function", function () {
var callback = sinon.spy();
var proxy = once(callback);
proxy();
assert(callback.called);
});
还是没有看懂,于是只能自己试着写了一篇,发现原来很简单,只是因为官方给的例子不够清晰。
it('should be call coapserver close after stop iot-coap server', function(){
var coapserver = { close: function(){}};
var spyCoAP = sinon.spy(coapserver, "close");
spyCoAP();
iotcoap.close();
assert(spyCoAP.calledOnce);
});
上面就是测试的代码,当我们验证的是调用iotcoap.close()
的时候,会调用到coapserver.close
。
Jasmine是一个用来编写avascript测试的框架,它不依赖于任何其它的javascript框架,也不需要对DOM的依赖。
官网给了一个示例
describe("A spy, when configured to call through", function() {
var foo, bar, fetchedBar;
beforeEach(function() {
foo = {
setBar: function(value) {
bar = value;
},
getBar: function() {
return bar;
}
};
spyOn(foo, 'getBar').and.callThrough();
foo.setBar(123);
fetchedBar = foo.getBar();
});
it("tracks that the spy was called", function() {
expect(foo.getBar).toHaveBeenCalled();
});
但是显然这个示例对于我们来说有点长,相比之下,我们的代码
define([
'jquery',
'../../js/UserSession'
], function($, UserSession) {
'use strict';
describe("User Session", function() {
it("should can load session after save session", function() {
spyOn(UserSession, 'load');
UserSession.initialize();
expect(UserSession.load).toHaveBeenCalled();
});
});
});
在这里UserSession.initialize()
的时候会调用到UserSession.load
。
于是,我们的测试就这么写完了。。
围观我的Github Idea墙, 也许,你会遇到心仪的项目