我的功能(您可以在下面找到)使用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;
};
答案 0 :(得分:3)
您的代码中有4个错误:
window.getSelection
您应将其应用于window.getSelection
(不是document.getSelection
)。sel
和range
是undefined
。你替换
document.getSelection
带有返回字符串的函数
' Hello world!' (见第4行)。因此sel
变得相等
' Hello world!'和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;