对于每个Expect语句,mocha循环迭代中的it语句

时间:2019-03-24 20:33:54

标签: javascript mocha

我有这个对象数组。

let links = [
  { 
   url: 'some url 1',
   status: 200 
  },
  {
   url: 'some url 2',
   status: 200 
  }
] 

这是在before中异步调用LinkFunction的结果:

  before(async () => {
    try {
      links = await LinkFunction();
    } catch (err) {
      assert.fail(err);
    }
  });

我想检查urlstatus属性是否存在,以及它们的类型是否分别是字符串和数字。
注意:指定的对象只是一个大响应的示例。因此在任何情况下迭代都需要循环。

我已经完成了这个迭代:

  it('Array to contain some props', () => {
    links.map(property => {
      expect(property).to.have.property('url').to.be.a('string');
      expect(property).to.have.property('status').to.be.a('number');
    });
  });

但是我想要这样的东西:

it('Array to contain some props', () => {//or describe would be better here
  links.map(property => {
    it('link array to contain url string', () => {
      expect(property).to.have.property('url').to.be.a('string');
    });
    it('link array to contain status number', () => {
      expect(property).to.have.property('status').to.be.a('number');
    });
  });
});

不幸的是,it语句在map内部被忽略。也许是因为有几个嵌套的it语句。那么如何实现类似的逻辑?

更新

My full code:

1 个答案:

答案 0 :(得分:2)

您可能想使用forEach而不是map

还有"Passing arrow functions (aka "lambdas") to Mocha is discouraged",所以您可能希望将其更改为普通功能。

话虽如此,如果将links定义为mocha最初运行测试文件并收集单个it测试,则效果很好:

const expect = require('chai').expect;

describe('links', function() {
  let links = [
    { 
     url: 'some url 1',
     status: 200 
    },
    {
     url: 'some url 2',
     status: 200 
    }
  ]

  links.forEach(function(property) {
    it('link array to contain url string', function() {
      expect(property).to.have.property('url').to.be.a('string');
    });
    it('link array to contain status number', function() {
      expect(property).to.have.property('status').to.be.a('number');
    });
  });
});

..导致:

> mocha



  links
    √ link array to contain url string
    √ link array to contain status number
    √ link array to contain url string
    √ link array to contain status number


  4 passing (14ms)

更新

如您所见,it仅在最高级别或与describe一起使用:

before(function() {
  it('will NOT work here', function() { });
});

it('will work here', function() {
  it('will NOT work here', function() { });      
});

此外,links在首次运行时必须可用,并且it正在收集mocha测试,因此这也不起作用:

describe('links', function() {

  let links = [];

  before(function() {
    links = [
      { 
       url: 'some url 1',
       status: 200 
      },
      {
       url: 'some url 2',
       status: 200 
      }
    ];
  });

  // This won't work...
  links.forEach(function(property) {
    // .. since links is still an empty array when this runs
    it('should...', function() { /* ... */ });
  });

});

从问题更新中看,您的代码似乎是从links中的async函数调用中检索到before的。因此,在第一次运行测试并收集links测试时,无法填充it

因此,看起来您将无法跨links中的项目进行映射以创建it测试,而是需要采用您描述的方法,即跨多个项目中的项目进行映射links在一个测试中。