在qunit中模拟jquery函数 - Dexter应该在参数中接收有效的对象和方法组合

时间:2014-08-21 21:29:23

标签: javascript jquery unit-testing qunit

我尝试将测试添加到我的javascript应用中,使用QUnit和Dexterjs进行模拟功能。在这种情况下,我试图模拟$ .getLocation():

    QUnit.test( "testGetUrlVar", function() {

        var baseUrl = "http://www.example.com?ip=192.168.0.1";

        var fakeLocation  = Dexter.fake( document, '$.getLocation', function() {
                            return baseUrl.slice(baseUrl.indexOf('?') + 1).split('&');;
                        }),
                theUrlVar;

                theUrlVar = $.getUrlVar('ip');

                equal(theUrlVar,'ip','ip var found');

                fakeLocation.restore();

    });

但是我收到了这个错误:

testGetUrlVar (1, 0, 1)Rerun443492 ms
    Died on test #1 @http://localhost:5985/estante20140819/_design/library/test/urltoolsTests.js:1:1 : Dexter should receive a valid object and method combination in arguments. Ex.: window & "alert".

这是我试图嘲笑的代码:

$.extend({
  getUrlVars: function(){
    var vars = [], hash;
    var hashes = $.getLocation();
    for(var i = 0; i < hashes.length; i++)
    {
      hash = hashes[i].split('=');
      vars.push(hash[0]);
      vars[hash[0]] = hash[1];
    }
    return vars;
  },

  getUrlVar: function(name){
    return $.getUrlVars()[name];
  },

  getLocation: function(){   
      return window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
  }

});

更新

我已将错误缩小到dexter.js中的以下代码,错误是因为typeof(obj [method])未定义。

   if ( !obj || typeof( obj[ method ] ) !== 'function' ) {
            throw 'Dexter should receive a valid object and method combination in arguments. Ex.: window & "alert".';
        }

1 个答案:

答案 0 :(得分:0)

显然,当Dexter试图模拟该函数时,它未找到$$没有方法getLocation

那么,$来自哪里;它在您调用的范围内是否可见?

对Dexter的调用绝对应该是:

...
Dexter.fake( $, 'getLocation', function() {...});
...

但是你应该确保$在范围内,$.extend(...)函数在测试开始之前就已经运行了。