如何在mocha测试中杀死节点进程

时间:2017-10-07 23:46:53

标签: node.js

在我的测试中,我使用require('child_process')。exec来运行“npm run start-app”,它启动了一个webpack-dev-server。我的测试运行后,我想杀死我已经开始的过程。

目前我可以直接运行“mocha tests.js”成功终止进程。但是,当我使用调用“mocha tests.js”的“npm run tests”运行测试时,该进程不会被终止。这是因为节点进程阻止我杀死进程吗?

我通过使用ps-tree发现pid并使用kill -9或taskkill取决于操作系统来杀死该进程。

    test.after(function () {
        psTree(appStartProcess.pid, function (err, children) {
            if(/^win/.test(process.platform)) {
                for(var i = 0; i < children.length; i++) {
                    exec('taskkill /pid ' + children[i].PID + ' /T /F');
                }
            } else{
                cp.spawn('kill', ['-9'].concat(children.map(function (p) {
                    return p.PID;
                })));
            }
        });
    });

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:0)

我们可以在测试结束后kill使用#!/usr/bin/env node require('http').createServer((_, res) => { res.end('Hi from process') }).listen(3000, console.log) 返回的ChildProcess

鉴于以下服务器充当正在运行的进程:

const { exec } = require('child_process')

// this would typically be done in a separate helper
// that mocha executes before your tests
before(function (done) {
  // `this` is the shared mocha execution context
  this.runningProcess = exec('test/server.js')
  setTimeout(done, 500)
})

after(function () {
  this.runningProcess.kill()
})

describe('my tests', () => {
  it('properly initializes process', (done) => {
    require('http').get({
      port: 3000,
      agent: false
    }, (res) => {
      let data = ''
      res
        .setEncoding('utf8')
        .on('data', chunk => data += chunk)
        .on('end', () => {
          require('assert')(data === 'Hi from process')
          done()
        })
    })
  })
})

您的测试可能如下所示:

declare  
  maxLineNo number := 0;
  rc sys_refcursor;
BEGIN
select Max(b.Line_No) into maxLineNo
 FROM  Brokerage b
WHERE b.External_App_Id = 3720     AND b.Account_Id = '16970' ;

open rc for
SELECT b.External_App_Id   -- this select giving erro
         , ''
         , b.Currency
         , ''
         , CAST( SUM(b.Brokerage_Amt) as VARCHAR2(17))
         , ''
         , ''
         , 1003  -- 1003 for Report summary
         , ''
    FROM  Brokerage b
   WHERE b.External_App_Id = 3720 
   GROUP BY External_App_Id, B.CURRENCY
   ORDER BY 2; 

DBMS_OUTPUT.PUT_LINE(maxLineNo);  -- this is giving value

dbms_sql.return_result(rc);
end;

或者,您可以使用mocha以外的东西(例如,启动服务器的自定义脚本,运行mocha,然后关闭服务器),但概念基本相同。