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