如何单元测试检测浏览器的JavaScript函数?

时间:2015-04-16 07:35:33

标签: internet-explorer testing jasmine identification

我怎么能测试这个函数是做它应该做的? 我正在使用Jasmine作为测试框架。

function () { //if IE, return version number
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf('MSIE ');
    var trident = ua.indexOf('Trident/');

    if (msie > 0) { // IE 10 or older
      return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
    }

    if (trident > 0) { // IE 11 (or newer)
      var rv = ua.indexOf('rv:');
      return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
    }

    // other browser
    return false;
  }

我不介意这个功能是否有效。我需要为它编写一个测试。这意味着如果你告诉我它有效,它对我没有帮助。

1 个答案:

答案 0 :(得分:1)

您需要以某种方式模仿window.navigator.userAgent。最简单的解决方案是引入一个包装器:

function () { //if IE, return version number
    var ua = window.navigator.userAgent;
    return realFunction(ua);
}

然后为realFunction编写测试,通过在JavaScript控制台中执行window.navigator.userAgent来传递可以从多个浏览器获得的值。

您也可以尝试为window.navigator.userAgent分配一个值,然后调用原始函数,但我不能100%确定不同的浏览器如何响应此类操作(他们可能会忽略此类的赋值或抛出错误) 。这就是为什么我认为包装函数方法更清晰,更安全。

另一个选项就像Selenium,它可以从测试启动Web浏览器并远程控制它(打开页面,运行JavaScript)。

但这种方法很脆弱(特别是涉及IE时),设置速度慢且复杂(当你想测试的浏览器数量超过单个版本时)。