使用chaiAsPromised来测试集合中的对象是否具有密钥

时间:2016-08-05 13:49:33

标签: javascript mocha chai es6-promise

我有一个promise函数project_list,它返回一个数组对象,如下面的

[{foo:'k',bar:'j'}]

我有两个问题

  1. 有没有办法检查数组中是否存在给定的键?
  2. 我尝试了以下,但不幸的是 - 它似乎只检查值而不是键

     it('should return an array of objects containing project_details',function(){
        return expect(project_list(data)).to.eventually.have.deep.property('[0]','foo')
      })
    
    1. 有没有办法在一个promise对象上测试多个断言?即 - 我可以为一个承诺函数设置多个期望语句吗?
    2. 我试过这个

        it('should return an array of objects containing project_details',function(done){
          project_list(data).then(function(result){
            expect(result)[0].to.have.key('foo')
            expect(result)[0].to.have.key('bar')
            done()
          })
        })
      

      当我尝试测试上述内容时,我收到超时错误。

      相反,我以这种方式构建测试

        before(function(done){
          project_list(data).then(function(results){
            console.log(results)
            result = results;
            done()
          })
        })
      
        it('should retrieve a list',function(){
          expect(result).to.be.an('array')
        })
      
        it('should return an array of objects containing project_details',function(){
          expect(result[0]).to.contain.keys('foo')
        })
      

      这似乎奏效了。但我想知道是否有更好的白痴

1 个答案:

答案 0 :(得分:0)

当您使用property时,第二个参数是第一个参数中寻址的属性的。如果你只想检查属性是否存在,那么你不应该有第二个参数,第一个应该是属性的整个路径

至于做多个期望,是的,你可以。您只需要正确编写expect电话。 expect(result)[0]毫无意义。你应该检查keys(又名key)的工作原理。如果您未指定anyall,则all是默认设置,因此您的预期都会因此而失败。在下面的示例中,我选择any用于a)说明多个expect和b)具有测试通过。这两个电话可以合并为:expect(result[0]).to.have.all.keys('foo', 'bar');

以下是基于您问题中的代码的说明:

var chai = require("chai");
var chaiAsPromised = require("chai-as-promised");
var expect = chai.expect;

var value = [{foo:'k', bar:'j'}];
function project_list() {
    return Promise.resolve(value);
}

chai.use(chaiAsPromised);

it("test 1", function () {
    return expect(project_list()).to.eventually.have.deep.property('[0].foo');
});

it('test 2',function(){
    return project_list().then(function(result){
        expect(result[0]).to.have.any.key('foo');
        expect(result[0]).to.have.any.key('bar');
    });
});