javascript - 使用 Sinon 创建 document.getSelection stub

标签 javascript unit-testing qunit sinon

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

我试过像这样创建 stub :

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;
 };

最佳答案

您的代码中有 4 个错误:

  1. 第一个很明显。如果你想创建一个 stub window.getSelection 你应该将它应用到 window.getSelection (不是 document.getSelection)。
  2. 第二个也很明显。 原来 selrangeundefined。你替代 document.getSelection 带有返回字符串的函数 ' Hello World !' (参见第 4 行)。因此 sel 变得等于 ' Hello World !'和 sel.getRangeAt 以及 sel.rangeCount 未定义。因此整个表达式 sel.getRangeAt && sel.rangeCountfalserange 作为结果返回 保持 undefined(您得到的确切结果)。
  3. 你应该将 sinon.stub 的结果分配给 一个新变量(不是替换方法)。
  4. 总是在测试结束时恢复原来的方法。

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

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

要测试您可以使用的正向分支

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 已定义,您可以使用 stub

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;

关于javascript - 使用 Sinon 创建 document.getSelection stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35712531/

相关文章:

javascript - 为此加载点脚本选择不同的颜色

unit-testing - 对程序不应该做的单元测试

ios - 为什么 UIView 在手动实例化到模拟 UIViewController 后为 nil?

javascript - 访问 Backbone View 的功能以制作 sinon stub

javascript - 如何使用单个命令运行多个 QUnit (node.js) 测试文件?

c# - 使用 Web 服务自动完成 ASP.NET 失败

Javascript 拆分差异

javascript - 使用 Jest 测试 jQuery 动画

javascript - QUnit 数据提供者

javascript - 一旦建立连接,连接就会丢失 - NodeJS/MYSQL