【问题标题】:In Node, how to check that a particular object is an instance of ChildProcess在 Node 中,如何检查特定对象是否是 ChildProcess 的实例
【发布时间】:2015-01-31 22:14:03
【问题描述】:

我正在尝试检查(在单元测试中)某个特定对象是否是 ChildProcess,但我似乎无法获得对该类的引用(此处为 https://github.com/joyent/node/blob/7c0419730b237dbfa0ec4e6fb33a99ff01825a8f/lib/child_process.js

我想做的事情是这样的

selenium = require('selenium-standalone')
spawnOptions = { stdio: 'pipe' }
seleniumArgs = ['-Dwebdriver.chrome.driver=./node_modules/nodewebkit/nodewebkit/chromedriver']
@server = selenium(spawnOptions, seleniumArgs)

expect(server).to.be.an.instanceof(ChildProcess)

但我似乎不知道从哪里获得对 ChildProcess 的引用

更新:根据提供的答案,我现在正在使用以下方法进行测试:

it 'start()', (done)->
  selenium.start.assert_Is_Function()
  selenium.start ->
    selenium.server.assert_Is_Not_Null()
    selenium.server.constructor.assert_Is_Function()
    selenium.server.constructor.name.assert_Is('ChildProcess')
    done()

【问题讨论】:

    标签: node.js coffeescript mocha.js


    【解决方案1】:

    不幸的是,child_process module 没有导出其 ChildProcess 类。您可以轻松访问server 的构造函数,但您没有任何东西可以与之比较。

    我可以看到两个选项。

    检查server的构造函数名称是ChildProcess

    expect(server).to.have.property('constuctor');
    expect(server.constuctor).to.have.property('name', 'ChildProcess');
    

    您还可以添加检查 server.constuctor 是否继承自 EventEmitter

    expect(server).to.be.an.instanceof(require('events').EventEmitter);
    

    spawn调用获取ChildProcess

    但如果您想确定serverChildProcess 而不是模拟,那么您可以从spawn call 获取ChildProcess 类:

    ChildProcess = require('child_process').spawn('echo').constructor; // use any command
    

    您将能够使用它来验证您的 server 对象:

    expect(server).to.be.an.instanceof(ChildProcess);
    

    如果你不想实际生成任何东西,你可以使用任何不存在的命令。只是不要忘记指定一个错误处理程序以防止child_process 抛出错误:

    child = require('child_process').spawn('non-existing-command');
    child.on('error', function() {}); // empty error handler
    ChildProcess = child.constructor;
    

    【讨论】:

    • 太好了,谢谢。我更新了问题以显示我最终如何测试它
    • 嘿Dinis——只是好奇我对“为什么”感兴趣——你为什么需要检查对象是否是instanceOf childProcess? - 以防我稍后在编码中遇到需求。谢谢!
    • @jamesemanon 我迟到了两年,我不能代表 Dinis,但我检查的原因是在单元测试中,以确保我正在测试的函数返回一个孩子像它应该的那样处理。
    【解决方案2】:

    child_process 从节点 4.0 开始公开 ChildProcess 类。

    var ChildProcess = require('child_process').ChildProcess
    expect(server).to.be.an.instanceof(ChildProcess)
    

    在 PR 中添加:https://github.com/nodejs/node/pull/1760

    【讨论】:

      猜你喜欢
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      相关资源
      最近更新 更多