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

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)