JS单元测试原型方法

时间:2017-01-20 11:31:09

标签: javascript unit-testing

因为在IE8中不支持trim()我想要一个后退选项来使用正则表达式(我知道这里有许多例子),所以有这个

function trim(value) {
  if (typeof value === 'string') {
    if (String.prototype.trim) {
      value = value.trim();
    } else {
      value = value.replace(/^\s+|\s+$/g, "");
    }
  }

  return value;
}

我想要做的是为此编写单元测试,所以基本上将String.prototype.trim设置为truefalse,以便我可以确保本机和正则表达式选项是使用

describe('trim', function() {
  it('should use native trim if available', function(){
    String.prototype.trim = true; // THIS DOES NOT WORK
    var string = 'test string  ';
    expect(string.trim()).toEqual('test string');
  });  
});

我怎么能这样做?

由于

2 个答案:

答案 0 :(得分:1)

在该示例中,您将String.prototype.trim重新分配给布尔值。这意味着您不能再调用string.trim()。

您可以通过将String.prototype.trim指定为false来检查您的polyfill是否正常工作,然后调用trim(string)。

describe('trim', function() {
  it('should use native trim if available', function(){
    String.prototype.trim = false;
     var string = 'test string  ';
    expect(trim(string)).toEqual('test string');
  });  
});

我对重新分配String的属性感到非常不舒服,因此您可以将ie8修剪分解为单独的功能,然后您可以更轻松地进行测试。

function ie8Trim(value) {
  if (typeof value === 'string') {
   return value.replace(/^\s+|\s+$/g, "")
  }
  return value
}

function trim(value) {
  if (typeof value === 'string') {
    if (String.prototype.trim) {
      return value.trim();
    } else {
      return ie8Trim(value)
    }
  }
  return value;
}

答案 1 :(得分:0)

你至少有两个选择:

  1. 在不同的浏览器中测试整个方法(不仅仅是String.prototype.trim)。这是推荐的方式。你的代码将在不同的浏览器中运行,你应该在那里进行测试

  2. 如果由于任何原因你不能/不想在不同的浏览器中测试,你可以使用IOC和更高阶函数:构建函数,它接受true/false并返回一个修剪a的函数串。然后在两种情况下测试此函数是否正常工作。在作为输入参数的生产中,您使用String.prototype.trim

  3. 你也可以改变内置函数的原型(AFAIK这并不总是因为安全原因而起作用)但是它很危险,因为你不知道(或很容易错过)你知道你使用哪些内置函数测试您在测试中使用的框架和库以及代码。所以不要这样做