按照承诺测试拒绝与拒绝

问题描述:

我想测试一个函数返回一个承诺。按照承诺测试拒绝与拒绝

在此特定试验中,承诺预计与含有经典message字段Error对象被拒绝(在该测试中,它预计相当于"my error message")和一个自定义字段我添加命名code,它是一个字符串(比如“EACCESS”,“ERIGHT”等,在这个测试中预计等于"EFOO"

我想使用chai-as-promised。

return expect(foo()).to.eventually.be.rejectedWith("my error message"); 

这种说法是工作,但现在我想测试code场了。
如何做到这一点?

+1

重复为[测试用于被拒绝的承诺的特定属性(http://stackoverflow.com/questions/23985949/testing-for-specific-properties-of-rejected-promises-with-mocha-and- chai-as-pro) – 2015-03-31 08:43:53

如果你使用Chai-As-Promised(因为你说你是),那么它允许链接关闭的rejectedWith - 它套,环断言对象是错误对象 - rejectedWith()后意味着什么现在要断言上错误。这让你做很酷的事情,如:

return expect(foo()).to.eventually 
    .be.rejectedWith("my error message") 
    .and.be.an.instanceOf(Error) 
    .and.have.property('code', 'EFOO'); 

一些柴方法也链条,所以你可以用它来做出有关该错误的一些相当深嵌套断言:

return expect(foo()).to.eventually 
    .be.rejectedWith("my error message") 
    .and.have.property('stack') 
    .that.includes('myfile.js:30') 
+2

因为某些原因,这对我不起作用。不管我做错误消息字符串它总是通过。 – chovy 2016-04-15 20:37:52

+0

@chovy可以粘贴foo()的方法代码。如果您正在使用return语句,并且在拒绝处理程序中,您可以验证您的系统正在测试(方法),如果您明确拒绝...否则promise将被视为已解决。 – 2016-05-05 03:55:04

+0

'foo()'返回'$ q.defer()。promise' - 显然chai-as-promised与angular的'$ q'有关系。 – chovy 2016-05-05 22:45:37

有5.1版。 ChaiAsPromised,从Keithamus解决方案并没有为我工作的0 - rejectedWith并没有给我的错误对象断言,但“拒绝”做的:

return expect(foo()) 
    .to.be.rejected 
    .and.be.an.instanceOf(Error) 
    .and.have.property('code', 'EFOO'); 

对于断言多个属性

return expect(foo()) 
    .to.be.rejected 
    .then(function(error) { 
     expect(error).to.have.property('name', 'my error message'); 
     expect(error).to.have.property('code', 'EFOO'); 
    });