【问题标题】:Promise rejected or fulfilled confusion承诺被拒绝或履行的混乱
【发布时间】:2017-12-07 15:26:10
【问题描述】:

我有一个promise函数

create(data) {
        return new Promise((resolve, reject) => {
            const datetime = Date.parse(new Date());
            data.createdAt = datetime;
            data.updatedAt = datetime;
            this._db.collection(this._table).insertOne(data, (err) => {
                if (err) {
                    this._logger.error(err);
                    reject(err);
                } else {
                    resolve(data);
                }
            });
        });
    }

并为其编写单元测试

it('should reject insertion', () => {
    const promise = Agent.create(data).then(() => (Agent.create(data)));
    return expect(promise).to.be.rejected;
});

这个断言通过了。但是如果单元测试是:

it('should reject insertion', () => {
    const promise = Agent.create(data).then(Agent.create(data));
    return expect(promise).to.be.rejected;
});

失败了。错误是AssertionError: expected promise to be rejected but it was fulfilled with { Object (_id, role, ...) }

这两种做法的区别在哪里?我还没收到。

【问题讨论】:

  • 你问() => Agent.create(data)Agent.create(data)有什么区别?
  • 区别在于将函数传递给 .then(这是 .then 所期望的)和将函数的结果(在本例中为 Promise)传递给 .then 之间的区别。 .. .then 忽略传递给它的任何非函数参数,.then 返回的结果承诺采用前一个承诺的值 - 这当然是一个已解决的承诺,而不是一个被拒绝的承诺
  • @JaromandaX 据我所知,如果我将第二个更改为Agent.create(data).then(Agent.create(data).catch...)Agent.create(data).then(Agent.create(data)).catch,它们是否会产生相同的结果(被拒绝)
  • 不,.then 的参数必须是函数,而不是调用函数的结果
  • @JaromandaX 非常感谢。我明白了

标签: javascript node.js unit-testing testing promise


【解决方案1】:

正如许多 cmets 所指出的,您在第一种情况下传递一个函数,在另一种情况下传递返回值,这是一个承诺。这就是您看到结果差异的原因。

【讨论】:

  • 据我所知,如果我将第二个更改为 Agent.create(data).then(Agent.create(data).catch...)Agent.create(data).then(Agent.create(data)).catch,它们会产生相同的结果(被拒绝)
  • 不是链接承诺的最佳方式。看这里:html5hive.org/how-to-chain-javascript-promises
猜你喜欢
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 2018-05-09
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多