Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用apply、call或bind方法在JavaScript中注入依赖项_Javascript_Unit Testing - Fatal编程技术网

使用apply、call或bind方法在JavaScript中注入依赖项

使用apply、call或bind方法在JavaScript中注入依赖项,javascript,unit-testing,Javascript,Unit Testing,我对JavaScript相当陌生,对对象的单元测试有疑问 这就是方法正在使用JavaScript绑定、应用和调用方法 被认为是依赖注入的一种形式?我这样问是因为我有几个 我想对使用“this”关键字的函数进行单元测试,我想 在运行测试之前设置这些函数的上下文。我应该打电话给警察吗 构造函数,然后对这些方法或方法进行单元测试 我可以使用apply、call或bind方法之一吗?下面提供的示例: function assert(v1, v2) { console.log(v1 === v2);

我对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>');
函数断言(v1、v2){
console.log(v1==v2);
}
函数用户(名字、姓氏、标识符){
this.firstName=firstName;
this.lastName=lastName;
this.identifier=标识符;
}
User.prototype.getUserString=函数(){
返回this.lastName+,“+this.firstName+”;
}
//第一种选择:
var user=新用户('Andrew','Schools','09AF22');
断言(user.getUserString(),'Schools,Andrew');
//第二种选择:
var getUserString=User.prototype.getUserString.bind({
“姓氏”:“学校”,
“名字”:“安德鲁”,
“标识符”:“09AF22”
});
断言(getUserString(),'Schools,Andrew');
我对选项一的担心是,在调用自己的属性后,其他方法可以更改它们,从而使我的测试失败。我想我可以在每次测试之前重置变量,但这是额外的工作,尤其是当对象有许多自己的属性时单元测试时使用apply、call或bind方法是否存在任何问题?

我想我可以在每次测试之前重置变量,但这是额外的工作,尤其是当对象有许多自己的属性时

其实这并不难。为了测试套件,您定义了创建一组用于测试的对象和模拟的方法。在每次测试之前重置对象

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

prepare();
assert(test1);
prepare();
assert(test2);
这就是为什么像karma、mocha这样的测试框架在每个单元测试之前都有
beforeach
方法,允许在每个单元测试之前重置环境。因为每个单元测试都不应该依赖于另一个单元测试的结果。

没有。考虑A的某种形式/变体是更合适的。但是,请注意绑定的问题在于它修改了原型共享状态,这与使用构造函数参数创建仅修改实例状态的对象大不相同。(我之所以说‘mock’,是因为测试不应该测试mock对象——如果确实存在DI,那么组件将被模拟。)