【问题标题】:Creating a stub of document.getSelection using Sinon使用 Sinon 创建 document.getSelection 的存根
【发布时间】:2016-06-13 06:11:56
【问题描述】:

您可以在下面找到我的函数,它使用document.getSelection 来获取屏幕上当前选定的文本。我需要能够指定document.getSelection 的值,以便测试我的功能。

我尝试像这样创建存根:

document.getSelection = sinon.stub(document, "getSelection", function() { return "Hello world!" } );

var selection = wysiwyg.getCurrentRange();

但是,它只是得到undefined 供选择。谁能告诉我我做错了什么?

这是我正在测试的方法:

 Wysiwyg.prototype.getCurrentRange = function() {
    var sel, range;
    if ( window.getSelection ) {
        sel = window.getSelection();
        if ( sel.getRangeAt && sel.rangeCount ) {
            range = sel.getRangeAt( 0 );
        }
    } else if ( document.selection ) {
        range = document.selection.createRange();
    }

    return range;
 };

【问题讨论】:

  • 问题现在解决了吗?
  • 是的。感谢您的帮助。
  • 拜托,你能也奖励赏金吗?我是唯一提供答案的人。正如您所确认的那样,它很有用。
  • 对不起,赏金没有出现在 SO 应用程序中,所以我认为它是自动授予的。您现在应该已经收到了。
  • 我明白了。谢谢

标签: javascript unit-testing qunit sinon


【解决方案1】:

您的代码中有 4 个错误:

  1. 第一个很明显。如果您想为 window.getSelection 你应该把它应用到window.getSelection (不是document.getSelection)。
  2. 第二个也很明显。 原来selrangeundefined。你代替 document.getSelection 带有返回字符串的函数 '你好世界!' (见第 4 行)。因此sel 等于 '你好世界!'和sel.getRangeAtsel.rangeCountundefined。因此,整个表达式 sel.getRangeAt && sel.rangeCountfalserange 您作为结果返回 仍然是undefined(你得到的确切结果)。
  3. 您应该将sinon.stub 的结果分配给 一个新变量(不是被替换的方法)。
  4. 始终在测试结束时恢复原始方法。

另请注意,如果方法未定义,则不能将存根应用于方法。

在您的情况下考虑到上述所有内容,没有存根的解决方案会更好。

要测试你可以使用的正分支

var getRangeAtResult = 'getRangeAt Expected Result';
var getRangeAtSpy = sinon.spy(function() {
    return getRangeAtResult;
});

var windowGetSelectionBackUp = window.getSelection;
window.getSelection = function() {
    return {
        getRangeAt: getRangeAtSpy,
        rangeCount: true
    };
};

wysiwyg.getCurrentRange().should.be.equal(getRangeAtResult);

getRangeAtSpy.withArgs(0).called.should.be.equal(true);
window.getSelection = windowGetSelectionBackUp;

如果您确定 document.getSelection 已定义,您可以使用存根

var getRangeAtResult = 'getRangeAt Expected Result';
var getRangeAtSpy = sinon.spy(function() {
    return getRangeAtResult;
});

var documentGetSelectionStub = sinon.stub(document, 'getSelection', function() {
    return {
        getRangeAt: getRangeAtSpy,
        rangeCount: true
    };
});

wysiwyg.getCurrentRange().should.be.equal(getRangeAtResult);

getRangeAtSpy.withArgs(0).called.should.be.equal(true);
documentGetSelectionStub.restore();

要测试你可以使用的负分支

var createRangeResult = 'createRange Expected Result';
var createRangeSpy = sinon.spy(function() {
    return createRangeResult;
});

var documentSelectionBackUp = document.selection;
document.selection = function() {
    return {createRange: createRangeSpy};
};

wysiwyg.getCurrentRange().should.be.equal(createRangeResult);

createRangeSpy.called.should.be.equal(true);
document.selection = documentSelectionBackUp;

【讨论】:

  • 我有点困惑。在您回答的开头,您纠正了我,说我应该监视window.getSelection(),但在回答过程中,您切换并说“如果您确定document.getSelection 已定义,您可以使用存根”。那么我应该监视document.getSelection()window.getSelection() 哪个?
  • 请重新检查您的代码。 document.getSelection 无处使用。你没看到吗?你使用window.getSelectiondocument.selection
  • 在您的情况下,最好使用没有存根的解决方案
  • 对,我不知道我为什么在我的问题中说document.getSelection。一旦我看到你的第一颗子弹,我就知道我说错了。另外,在这种情况下,为什么存根比间谍更好?
  • @RandomlyKnighted 在您的情况下,window.getSelection 可以未定义。因此,您不能为此使用存根。我也不建议用间谍替换存根。工具不一样。实际上,我使用 spy 来检查 window.getSelection().getRangeAt 是否使用参数 0 调用。这只是一个额外的检查。如果它对你不重要,你可以定义 getRangeAt 没有间谍。
猜你喜欢
  • 2013-12-01
  • 2016-08-09
  • 2014-11-29
  • 2020-12-12
  • 1970-01-01
  • 2015-11-28
  • 2018-08-19
  • 2021-07-26
  • 2019-12-04
相关资源
最近更新 更多