我有这个对象数组。
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);
}
});
我想检查url
和status
属性是否存在,以及它们的类型是否分别是字符串和数字。
注意:指定的对象只是一个大响应的示例。因此在任何情况下迭代都需要循环。
我已经完成了这个迭代:
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语句。那么如何实现类似的逻辑?
更新:
答案 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
在一个测试中。