Jos*_*man 10 javascript unit-testing mocking coffeescript sinon
我想在我的coffeescript单元测试中使用测试双打来帮助分离关注点.
我正在使用带有mocha的sinon(在带有konacha的Rails应用程序的上下文中.)
我正在尝试在这一点上看起来直接来自文档,其中有一个模拟用法示例:
var myAPI = { method: function () {} };
var spy = sinon.spy();
var mock = sinon.mock(myAPI);
mock.expects("method").once().throws();
PubSub.subscribe("message", myAPI.method);
PubSub.subscribe("message", spy);
PubSub.publishSync("message", undefined);
mock.verify();
assert(spy.calledOnce);
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我试图模拟对象的函数调用,如下所示:
canvas = sinon.mock getContext: (arg) ->
canvas.expects("getContext").once()
canvas.getContext('2d')
canvas.verify()
Run Code Online (Sandbox Code Playgroud)
这给出了一个不是函数的TypeError指示getContext:
TypeError:canvas.getContext不是函数
模拟似乎已设置并正确验证.省略呼叫时getContext,我被告知未达到预期:
ExpectationError:预期getContext([...])一次(从未调用)
编译好的JavaScript看起来像这样,然后:
var canvas;
canvas = sinon.mock({
getContext: function(arg) {}
});
canvas.expects("getContext").once();
canvas.getContext('2d');
canvas.verify();
Run Code Online (Sandbox Code Playgroud)
有什么可以解释这个错误?
我想知道我是否在使用函数参数做了一些奇怪的事情,但是我可以在没有getContext调用参数的情况下重现这个.
Jos*_*man 12
你试图直接在模拟上调用方法,但这不是Sinon.JS如何看待模拟.再次考虑示例代码:
var myAPI = { method: function () {} };
var spy = sinon.spy();
var mock = sinon.mock(myAPI);
mock.expects("method").once().throws();
PubSub.subscribe("message", myAPI.method);
PubSub.subscribe("message", spy);
PubSub.publishSync("message", undefined);
mock.verify();
assert(spy.calledOnce);
Run Code Online (Sandbox Code Playgroud)
该测试题目是myAPI,没有mock.在上面的例子中,类似下面的内容将起作用:
canvas_api = getContext: ->
canvas_mock = sinon.mock(canvas_api)
canvas_mock.expects("getContext").once()
canvas_api.getContext()
canvas_mock.verify()
Run Code Online (Sandbox Code Playgroud)