使用apply,call或bind方法在JavaScript中进行依赖注入

时间:2015-06-23 00:34:29

标签: javascript unit-testing

我对JavaScript很陌生,对单元测试对象有疑问 这是方法。 使用JavaScript绑定,应用和调用方法 被认为是依赖注入的一种形式?我问,因为我有几个 函数我想要使用'this'关键字进行单元测试,我想 在运行测试之前设置这些函数的上下文。我应该打电话给 具有适当参数的构造函数然后单元测试那些方法或 我可以使用apply,call或bind方法之一吗?示例如下:

function assert(v1, v2) {
  console.log(v1 === v2);
}

function User(firstName, lastName, identifier) {
  this.firstName = firstName;
  this.lastName = lastName;
  this.identifier = identifier;
}

User.prototype.getUserString = function() {
  return this.lastName + ", " + this.firstName + " <" + this.identifier + ">";
}

// First option:

var user = new User('Andrew', 'Schools', '09AF22');
assert(user.getUserString(), 'Schools, Andrew <09AF22>');

// Second option:

var getUserString = User.prototype.getUserString.bind({
  'lastName': 'Schools',
  'firstName': 'Andrew',
  'identifier': '09AF22'
});

assert(getUserString(), 'Schools, Andrew <09AF22>');

我对选项一的关注是,在调用它们之后,其他方法可以更改自己的属性,从而使我的测试失败。我想我总是可以在每次测试之前重置变量,但这是额外的工作,特别是如果对象有很多自己的属性。 单元测试时使用apply,call或bind方法有什么问题吗?

1 个答案:

答案 0 :(得分:2)

  

我想我总是可以在每次测试之前重置变量,但这是额外的工作,特别是如果对象有很多自己的属性。

实际上这并不是很困难。为了您的测试套件,您可以定义创建一组对象和模拟进行测试的方法。并且在每次测试之前重置对象。

var user;
function prepare(){
    user = new User('Andrew', 'Schools', '09AF22');
}

prepare();
assert(test1);
prepare();
assert(test2);

这就是为什么像karma,mocha这样的测试框架有beforeEach方法允许在每次单元测试之前重置环境的原因。因为每个单元测试不应该依赖于另一个单元测试的结果。