gpt4 book ai didi

javascript - Sinon.JS - 如何从 stub 中获取参数?

转载 作者:数据小太阳 更新时间:2023-10-29 04:09:47 24 4
gpt4 key购买 nike

我正在尝试使用 Sinon 来测试一个看起来有点像这样的 JS 组件......

import Bootbox from "../helpers/bootbox";
import Guard from "../helpers/guard";
import UrlHelper from "../helpers/url-helper";

export default class DeleteButton {

/**
* Creates an instance of DeleteButton.
*
* @param {object} element The DOM element to make into a delete button.
*
* @memberOf DeleteButton
*/
constructor(element) {
Guard.throwIf(element, "element");

this.deleteUri = element.getAttribute("data-delete-uri") || UrlHelper.current.url().split('?')[0];
this.title = element.getAttribute("data-title") || `Delete the item?`;
this.cancelText = element.getAttribute("data-cancel") || `Cancel`;
this.confirmText = element.getAttribute("data-confirm") || `Remove`;
this.message = element.getAttribute("data-message") || `Do you want to delete the item? This cannot be undone.`;
this.successUri = element.getAttribute("data-success-uri");
this.errorMessage = element.getAttribute("data-error-message") || `Unable to complete operation.`;
}

/**
* Shows failure of deletion.
*
* @memberOf DeleteButton
*/
showFailed() {
Bootbox.alert({
message: this.errorMessage,
size: `small`,
backdrop: true
});
}
}

测试看起来像这样......

it("Can show a fail message", function() {
$("body").append(`<a class="js-delete-button" data-id="123" data-delete-uri="/delete/123">Delete</a>`);
let objUt = new DeleteButton($(".js-delete-button").get()[0]);
let bootboxAlertStub = Sinon.stub(Bootbox, 'alert');
objUt.showFailed();
let args = bootboxAlertStub.args;
expect(args.message).to.equal(objUt.errorMessage);
});

但我无法通过 let bootboxAlertStub = Sinon.stub(Bootbox, 'alert'); 这行,因为我从 Karma 那里收到一条错误消息,说“应该包装对象的属性”。我也尝试将其包装在 Sinon.test 包装器中并使用 this.stub 但错误更加迟钝。

我浏览了 Sinon.JS 文档并进行了在线搜索,但还是卡住了。代码工作正常。

我看过这个帖子,它是相似的 - Stubbing a class method with Sinon.js但这并不完全相同。

查看实际的底层 bootbox JavaScript 文件,我正在有效地尝试 stub 一个看起来有点像这样(删减)的方法......

  exports.alert = function() {
// do something
};

然后 JS 文件在最后返回导出...

  return exports;

查看一些 Github 帖子,似乎无法对这些特定调用进行 stub ,因为底层调用是实用函数而不是对象函数。

我通过如下更改我的 Bootbox 包装器类来缓解这种情况(以一种可怕的方式)...

export default {

/**
* Generates an alert box.
*
* @param {any} options
*/
alert: function(options) {
window.bootbox.alert(options);
},

/**
* Generates a confirmation dialog.
*
* @param {any} options
*/
confirm: function(options) {
window.bootbox.confirm(options);
}
}

这解决了一个问题并引入了另一个问题。虽然我现在可以 stub Bootbox,但 stub 时我无法获得参数....

(来自测试)

let args = bootboxAlertStub.args;

这令人沮丧 - 参数作为复杂参数传递,因此“calledWith”断言不会削减它。

有什么方法可以获得 stub 的参数吗?

最佳答案

感谢Matt Mokary (如果你想提交一个答案,我会把这个归功于你)

我按如下方式编辑我的测试......

it("Can show a fail message", Sinon.test(function() {        
$("body").append(`<a class="js-delete-button" data-id="123" data-delete-uri="/delete/123">Delete</a>`);
let objUt = new DeleteButton($(".js-delete-button").get()[0]);
let bootboxAlertStub = this.stub(Bootbox, 'alert');
objUt.showFailed();
Sinon.assert.called(bootboxAlertStub);
let options = bootboxAlertStub.getCall(0).args[0];
expect(options.message).to.equal(objUt.errorMessage);
}));

正如 Matt 所建议的那样,修复它的方法是使用...

bootboxAlertStub.getCall(0);

稍作调整

bootboxAlertStub.getCall(0).args[0];

获取第一个参数(即选项对象)。

顺便说一句,当我通过 Phantom 和 Karma 运行测试时,发现我可以使用 console.log 查看发生了什么,这既是一个启示,也是一个令人震惊的时刻。

关于javascript - Sinon.JS - 如何从 stub 中获取参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42401724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com