如何在单元测试时测试绑定函数的相等性?

Phi*_*per 6 javascript unit-testing jasmine

我想测试传递给函数的参数是函数引用但是函数引用是使用传递的bind().

考虑一下要测试的代码(为简洁起见缩短):

initialize: function () {
    this.register(this.handler.bind(this));
}
Run Code Online (Sandbox Code Playgroud)

并且这个单元测试检查是否register()被调用handler():

it('register handler', function () {
    spyOn(bar, 'register');
    bar.initialize();
    expect(bar.register.calls.argsFor(0)[0]).toEqual(bar.handler);
});
Run Code Online (Sandbox Code Playgroud)

由于绑定函数的使用,arg不等于函数引用bind()- 如何在仍然使用bind()方法的同时测试正确的函数引用?

注意:这不是特定于茉莉花,我只是认为它是合适的,因为使用的方法.

use*_*596 6

代替

expect(bar.register.calls.argsFor(0)[0]).toEqual(bar.handler);
Run Code Online (Sandbox Code Playgroud)

你可以做

expect(Object.create(bar.handler.prototype) instanceof bar.register.calls.argsFor(0)[0])
  .toBe(true);
Run Code Online (Sandbox Code Playgroud)

要么

expect(Object.create(bar.handler.prototype)).
  toEqual(jasmine.any(bar.register.calls.argsFor(0)[0]));
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为[[HasInstance]]绑定函数的内部方法委托给[[HasInstance]]原始函数的方法.

这篇博客文章对绑定函数进行了更详细的分析.