您可以在下面找到的我的函数使用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;
 };

最佳答案

您的代码中有4个错误:


第一个很明显。如果您想为创建存根
window.getSelection您应将其应用于window.getSelection
(不是document.getSelection)。
第二个也是显而易见的。
最初selrangeundefined。你替代
document.getSelection具有返回字符串的函数
'你好,世界!' (请参阅第4行)。因此sel等于
'你好,世界!'和sel.getRangeAt以及sel.rangeCount
undefined。因此,整个表达式sel.getRangeAt &&sel.rangeCountfalserange您返回的结果
仍为undefined(您得到的确切结果)。
您应将sinon.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,则可以使用存根

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/

10-16 05:59