Ava解决了这个问题

时间:2017-03-10 09:51:58

标签: ava

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"

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

1 个答案:

答案 0 :(得分:0)

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

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

奖金提示:

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

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

AVA似乎解除了实例方法'this'。

不,这就是this在JavaScript中的工作原理。如果传递类方法,则需要将其绑定到其实例以保留this。您可能会发现我的auto-bind模块很方便。