0

AVA 似乎解除了实例方法“this”的绑定。

class Person {
    constructor(name) {
        this.name = name;
    }

    sayMyName() {
        const name = this.name;
        return new Promise(function (resolve, reject) {
            reject(new Error(name));
        });
    }
}

test('test', async (t) => {
    const person1 = new Person('Bob');
    const error = await t.throws(person1.sayMyName);
    t.is(error.message, 'Bob');
});

对于上面的代码,我得到这个:

   85:     const error = await t.throws(person1.sayMyName);
   86:     t.is(error.message, 'Bob');
   87: });

  Difference:

  "CannBot read property \'name\' of undefinedb"

我试过像这样手动绑定这个promise:person1.sayMyName.bind(person1),但这似乎也不起作用。

4

1 回答 1

0

t.throws()接受一个承诺,所以你只需要调用你的函数:

const error = await t.throws(person1.sayMyName());

奖励提示:

如果您只需要检查错误消息,您的断言可以简化为以下内容:

await t.throws(person1.sayMyName, 'Bob');

AVA 似乎解除了实例方法“this”的绑定。

不,这就是thisJavaScript 的工作原理。如果你传递一个类方法,你需要将它绑定到它的实例以保留this. 你可能会发现我的auto-bind模块很方便。

于 2017-03-12T18:02:57.077 回答