为什么这个Sinon mock有一个不是函数的模拟方法?

时间:2015-07-04 15:57:58

标签: javascript unit-testing coffeescript mocking sinon

我想在我的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}}调用参数的情况下重现这一点。

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()