我想在我的coffeescript单元测试中使用测试双打来帮助分离关注点。
我正在使用带有mocha的sinon(在带有konacha的Rails应用程序的上下文中。)
我正在尝试这一点似乎直接来自the documentation,其中有一个模拟用法示例:
canvas = sinon.mock getContext: (arg) ->
canvas.expects("getContext").once()
canvas.getContext('2d')
canvas.verify()
在我的情况下,我试图模拟一个对象的函数调用,如下所示:
TypeError
这会产生getContext
,表示getContext
不是函数:
TypeError:canvas.getContext不是函数
模拟似乎已设置并正确验证。省略对var canvas;
canvas = sinon.mock({
getContext: function(arg) {}
});
canvas.expects("getContext").once();
canvas.getContext('2d');
canvas.verify();
的调用时,我被告知未达到预期:
ExpectationError:预期getContext([...])一次(从未调用)
编译的JavaScript看起来像这样,然后:
getContext
有什么可以解释这个错误?
我想知道我是否对函数参数做了一些奇怪的事情,但我可以在没有{{1}}调用参数的情况下重现这一点。
答案 0 :(得分:11)
你试图直接在模拟上调用方法,但这并不是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);
正在测试的主题是myAPI
,而不是mock
。在上面的例子中,类似下面的内容将起作用:
canvas_api = getContext: ->
canvas_mock = sinon.mock(canvas_api)
canvas_mock.expects("getContext").once()
canvas_api.getContext()
canvas_mock.verify()