javascript - 使用 apply、call 或 bind 方法在 JavaScript 中进行依赖注入(inject)

标签 javascript unit-testing

我对 JavaScript 相当陌生,并且对对象的单元测试有疑问 以及它的方法。 正在使用 JavaScript 绑定(bind)、应用和调用方法 考虑过依赖注入(inject)的一种形式吗? 我问是因为我有几个 我想对使用“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方法有什么问题吗?

最佳答案

I guess I could always reset the variables before every test but that's extra work, especially if the object has many own properties.

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

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

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

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

关于javascript - 使用 apply、call 或 bind 方法在 JavaScript 中进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30992022/

相关文章:

python - 我应该测试辅助函数还是只测试主要函数?

javascript - 如何实现对 html5 播放器的 chromecast 支持

javascript - 使用 ng-repeat 在指令中显示数据

Javascript:了解文件接口(interface)

matlab - 在 Matlab 中显示单元测试成功的消息

java - Vaadin Spring 作用域对象 : is it possible to create a Vaadin unit test without starting up a servlet container?

javascript - 如何调用数组

javascript - 如何在复选框列表中移动复选标记?

javascript - 如何测试传递需要自身的nodejs模块

html - 如何使用 vw 单位在 css 中创建响应圈?