为什么这个 Sinon 模拟对象有一个被模拟的方法却不是一个函数?

11

我希望在我的Coffeescript单元测试中使用测试替身来帮助处理关注点分离。

我正在使用sinon和mocha(在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);

在我的情况下,我试图对一个对象进行函数调用的模拟,如下所示:

canvas = sinon.mock getContext: (arg) ->
canvas.expects("getContext").once()
canvas.getContext('2d')
canvas.verify()

这会产生一个TypeError,指示getContext不是一个函数:

TypeError: canvas.getContext 不是一个函数

Mock似乎已经设置并且得到正确验证。当省略对getContext的调用时,我会收到未满足期望的通知:

ExpectationError: 预期调用 getContext([...]) (从未被调用)

编译后的JavaScript代码如下:

var canvas;

canvas = sinon.mock({
  getContext: function(arg) {}
});

canvas.expects("getContext").once();

canvas.getContext('2d');

canvas.verify();

这个错误可能是什么原因造成的?

我在想是否在函数参数上做了一些奇怪的事情,但我可以在调用 getContext 时不使用参数重现这个错误。

1个回答

13

你正在尝试直接调用模拟对象的方法,但这并不是 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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接