使用 chaiAsPromised 测试集合中的对象是否有键

Using chaiAsPromised to test if object in collection has key

我有一个 promise 函数 project_list,其中 returns 一个数组对象,如下所示

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

我有两个问题

  1. 有没有办法检查给定的键是否存在于数组中?

我尝试了下面的方法,但不幸的是 - 它似乎只检查值而不是键

 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 对象上测试多个断言?即 - 我可以为一个 promise 函数设置多个 expect 语句吗?

我试过了

  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')
  })

这似乎有效。但是我想知道有没有更好的waty

当您使用 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');
    });
});