考虑以下规范:
describe('User', () => {
it('requires username', done => {
factory.build('user', { username: '' })
.then(user => user.validate())
.catch(error => expect(error.errors.messages.username).toMatch('is required'))
.then(done);
});
});
在这种情况下,如果创建成功,则不会调用catch
回调,我们是done
。所以基本上规范成功,而它应该失败。
这只是一个普遍问题的一个例子:当我们将期望置于then
/ catch
内时,我们无法确定它们是否会被调用。
你会怎么写这个?
对于这个具体的例子,我可以想到这样的解决方案(但我不喜欢以这种方式将回调与承诺混合):
describe('User', () => {
it('requires username', done => {
factory.build('user', { username: '' })
.then(user => user.validate(error =>
expect(error.errors.messages.username).toMatch('is required')))
.then(done);
});
});
答案 0 :(得分:2)
如果你不期望,你会抛出一个错误:
return factory.build('user', { username: '' })
.then(user => user.validate())
.then(result => { throw new Error("expected rejection but got fulfilled promise"); },
error => expect(error.errors.messages.username).toMatch('is required'))
或者,您可以手动或使用诸如reflect
之类的promise方法将两种情况转换为您匹配的结果值:
.then(result => null,
error => error)
.then(val => expect(val.errors.messages.username).toMatch('is required'))
如果您知道result
永远不是类似错误的对象,则可以省略第一个onFulfilled
回调或仅使用catch
。