【发布时间】: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