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

标签 javascript unit-testing coffeescript mocking sinon

我想在我的 coffeescript 单元测试中使用测试替身来帮助分离关注点。

我正在将 sinon 与 mocha 结合使用(在带有 konacha 的 Rails 应用程序的上下文中。)

我正在尝试在这一点上似乎直接来自 the documentation 的东西,其中有这个模拟用法的例子:

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 is not a function

模拟似乎已正确设置并得到验证。当省略对 getContext 的调用时,我被告知未满足预期:

ExpectationError: Expected getContext([...]) once (never called)

编译后的 JavaScript 看起来像这样,然后:

var canvas;

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

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

canvas.getContext('2d');

canvas.verify();

是什么导致了这个错误?

我想知道我是否对函数参数做了一些奇怪的事情,但我可以在不为 getContext 调用添加参数的情况下重现它。

最佳答案

您正在尝试直接在模拟上调用方法,但这不是 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()

关于javascript - 为什么这个 Sinon 模拟有一个不是函数的模拟方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31222566/

相关文章:

javascript - React Redux 状态数组更改不会重新渲染组件

angularjs - Jasmine 测试输入模式

python - python 包和测试的问题

JavaScript setInterval 未正确绑定(bind)到正确的关闭

javascript - 从 Rails 中的不同 CoffeeScript 文件调用函数

javascript - 单击页脚链接后滚动回页脚

javascript - ReactCSSTransitionGroup:transitionAppear 不起作用

javascript - 动态更新价格,多种选择

java - CompletableFuture runAsync内部的单元测试代码

events - 让 .once 在 Framer Studio 中工作?