Javascript Mocha安排一次测试数据清理

时间:2017-05-05 18:29:58

标签: javascript unit-testing mocha

我正在为我正在处理的产品执行单元测试的迷你框架。我希望尽可能无缝地发布和管理测试数据。使用Mocha,可以使用After()钩子轻松安排测试数据清理。

你可以在describe()块中包含一个单独的测试,并使用该块的Before / After方法,但是如果可能的话我宁愿避免这样做。

您可以将清理功能传递给afterEach,后者专门针对测试中填充的数据。虽然这只是一次清理所必需的,但这样做似乎很笨拙。

是否可以在一次测试中生成测试数据,仅仅是为了测试,还可以使用Mocha安排对其进行清理?

2 个答案:

答案 0 :(得分:0)

当然,只需在测试中运行您的生成和清理。如果它是异步的,你可以使用done回调让它等到它被调用。

mocha.setup('bdd');
describe('suite', function() {
  function getData() {
    // Simulate asynchronous data generation
    console.log('grabbing data');
    return new Promise((resolve, reject) => {
      setTimeout(() => resolve(100), 500);
    });
  }

  function cleanup() {
    // Simulate asynchronous cleanup
    console.log('cleaning up...');
    return new Promise((resolve, reject) => {
      setTimeout(resolve, 500);
    });
  }

  it('should do generation and clean up', function(done) {
    // Generate some data
    getData()
      .then(data => {
        // Test the data
        if (data !== 100) {
          throw new Error('How?!');
        }

        console.log('test passed');

        // Cleanup
        return cleanup();
      })
      .then(_ => {
        // Use done() after all asynchronous work completes
        console.log('done cleaning');
        done();
      })
      .catch(err => {
        // Make sure it cleans up no matter what
        cleanup().then(_ => console.error(err));
      });
  });
});
mocha.run();
<script src="https://cdn.rawgit.com/mochajs/mocha/2.2.5/mocha.js"></script>
<div id="mocha"></div>

答案 1 :(得分:0)

我认为测试后的清理通常是有问题的,因为清理一致性保证不是很强,即保证运行的清理功能?可能不是。如果不确定将进行清理,那么很可能会使下一个测试处于不一致的状态。我认为尝试尝试是件好事,但你可以通过以下方式防范失败:

  • 在每次测试之前清理/建立db状态
  • nuking the world所以每个测试都具有一致的状态(可以通过在事务的上下文中执行测试并在每次测试后回滚事务来完成,至少不会提交事务)
  • 让测试创建独特的数据。通过利用唯一数据,您还可以并行运行测试,因为它允许多个不同的测试具有db的独立视图。如果每个测试都写入自己的数据,则只需担心在每次测试运行开始时配置整个数据库

在上面,如果你能够在一个事务中包装你的测试它是快速的,(像django和rails这样的web框架这样做并且它非常快并且使得测试/ db状态非常容易推理)