【问题标题】:How to handle nested synchronous promises如何处理嵌套的同步承诺
【发布时间】:2018-01-17 18:28:41
【问题描述】:

这里是 JSON 示例:

test = [
    [
        {
            "name": "Test1.1",
            "flow": [
                {
                    "send": "test1.1.1",
                    "receive": [...]
                },
                {
                    "send": "test1.1.2",
                    "receive": [...]
                },
            ]
        },
        {
            "name": "Test1.2",
            "flow": [
                {
                    "send": "test1.2.1",
                    "receive": [...]
                },
                {
                    "send": "test1.2.2",
                    "receive": [...]
                },
            ]
        }
    ],
    [
        {
            "name": "Test2.1",
            "flow": [
                {
                    "send": "test2.1.1",
                    "receive": [...]
                },
                {
                    "send": "test2.1.2",
                    "receive": [...]
                },
            ]
        },
        {
            "name": "Test2.2",
            "flow": [
                {
                    "send": "test2.2.1",
                    "receive": [...]
                },
                {
                    "send": "test2.2.2",
                    "receive": [...]
                },
            ]
        }
    ]
 ]

我已经成功地使用以下代码运行了测试[0]

describe('Conversations', function () {
    for (let test of arrayOfTests) {
        describe(test.name, () => {
            for (let x = 0; x < test.flow.length; x++) {
                let node = test.flow[x];
                it("Request: " + node.request, (done) => {
                    chai.request('http://localhost:5001').then(done())//WORK
                });
            }
        });
    }
});

但是,当我尝试拉入整个测试文件并一个接一个地运行每个测试时,我开始遇到问题。我怀疑这可能是由于done() 的放置我已经厌倦了更新它,但我不完全确定如何去做。

我读到有一个it.each,但我不确定这对我的情况是否有帮助。

这是我尝试测试返回错误Empty test suite.的整个文件

干净利落的问题:如何更新以下代码以使用最顶级的 JSON。

describe('Full Tests', () =>  {
    request(
        // Get testSuite
    }).then((allTests) => {
        for (let tests of allTests) {
            describe('Single test Array', () =>  {
                for (let test of tests) {
                    describe("Test: "+ test.name, () => {
                        for (let x = 0; x < test.flow.length; x++) {
                            let node = test.flow[x];
                            it("Request: " + node.request, (done) => {
                                chai.request('http://localhost:5001').then(done())//WORK
                            });
                        }
                    });
                }
            });
        }
    });
});

【问题讨论】:

  • done() 被立即调用。传递给.then() 的函数应该是函数引用。您可以使用 async/await 在 for 循环中等待异步任务的结果
  • 我建议你看看 mocha 的“之前、之后、之前、之后每个钩子”mochajs.org/#hooks 这不是答案,但它会帮助你编写测试。

标签: javascript unit-testing mocha.js chai


【解决方案1】:

您可以使用async/awaitfor 循环中等待异步任务的结果

(async(tests) => {
  const done = (value) => value;
  const results = [];
  try {
    for (let {test} of tests) {
      results.push(
          await Promise.all(
            test.map(n => 
              new Promise(resolve => {
                setTimeout(
                  resolve
                , n * 250
                , {result:n * 250 < 1000
                  , test:`${n} * 250 < 1000`
                  }
                )
              })
            )
          )
          .then(done))
    }
  } catch(err) {
    throw err
  }
  return results
})([{
  test: [1, 2, 3]
}, {
  test: [4, 5, 6]
}])

.then(data => console.log(data))
.catch(err => console.error(err))

【讨论】:

  • 您好,谢谢您,但我很难了解这将如何应用于我的 Mocha 示例/我当前的实现有什么问题?
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2019-02-24
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
相关资源
最近更新 更多