您可以在下面找到的我的函数使用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
)。
第二个也是显而易见的。
最初sel
和range
是undefined
。你替代document.getSelection
具有返回字符串的函数
'你好,世界!' (请参阅第4行)。因此sel
等于
'你好,世界!'和sel.getRangeAt
以及sel.rangeCount
是undefined
。因此,整个表达式sel.getRangeAt &&sel.rangeCount
是false
和range
您返回的结果
仍为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/