使用Sinon创建document.getSelection的存根

时间:2016-03-01 00:32:53

标签: javascript unit-testing qunit sinon

我的功能(您可以在下面找到)使用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;
 };

1 个答案:

答案 0 :(得分:3)

您的代码中有4个错误:

  1. 第一个是显而易见的。如果你想为它创建一个存根 window.getSelection您应将其应用于window.getSelection (不是document.getSelection)。
  2. 第二个也很明显。 最初selrangeundefined。你替换 document.getSelection带有返回字符串的函数 ' Hello world!' (见第4行)。因此sel变得相等 ' Hello world!'和sel.getRangeAt以及sel.rangeCountundefined。因此,作为结果返回的整个表达式sel.getRangeAt && sel.rangeCountfalserange 仍然是undefined(你得到的确切结果)。
  3. 您应该将sinon.stub的结果分配给 一个新变量(不是替代方法)。
  4. 始终在测试结束时恢复原始方法。
  5. 请注意,如果未定义方法,则无法将存根应用于方法。

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

    要测试肯定分支,您可以使用

    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;