【问题标题】:spying on node child_process using jasmine使用 jasmine 监视节点 child_process
【发布时间】:2013-12-29 15:41:17
【问题描述】:

我是 nodejs 和 jasmine 的新手。从事一个学习 javascript/node 和 jasmine 的小项目。我试图监视节点中的对象 child_process 并查看使用指定的参数调用方法'spawn'。

jasmine 错误报告当调用 spawn 方法的对象(在本例中为 Nndb)时从未调用过 spawn。但实际工作是由子进程执行的,我在控制台中看到打印的结果。

这是我在运行 jasmine-node 脚本时看到的失败:

失败:

1) 为 xyz 抓取生成子进程 信息: 预期 spy spawn 已使用 [ '../src/scrape_nndb.js', 0 ] 调用,但 > 从不调用。 堆栈跟踪: 错误:使用 ['../src/scrape_nndb.js', 0] 调用了预期的间谍生成,但 > 它从未被调用。 在空。 (/Users/arun.bakt/skunkWorks/scraping/spec/nndb_spec.js:30:41) 在 Timer.listOnTimeout [as ontimeout] (timers.js:110:15)

在 6.024 秒内完成 1 次测试,1 次断言,1 次失败,0 次跳过”

它的茉莉花测试文件:

require('../src/nndb.js');

describe("scrape for XYZ", function() {

    var child = require('child_process');

    it("spawns child process", function() {

        var nndb = new Nndb();
        var child_process =  nndb.child_process;
        spyOn(child_process, "spawn");

        runs(function(){
            flag= false;
            nndb.scrapeForXYZ('../src/scrape_nndb.js', 0);
            setTimeout(function() {
                flag = true;
            },6000)
        });

        waitsFor(function(){
            return flag;
        }, "Scraping done", 6000);

        runs(function(){
            expect(child_process.spawn).toHaveBeenCalledWith('../src/scrape_nndb.js',0);
        });
    });

});

下面正在测试的文件nndb.js:

var StringDecoder = require('string_decoder').StringDecoder;

var decoder = new StringDecoder('utf8');

var child_process = require('child_process');

Nndb = function() {

    this.child_process = child_process;

    this.spawn = this.child_process.spawn;

};

Nndb.prototype.scrapeForXYZ = function( phantomScriptToRun, offSet) {


    var child =  this.spawn('phantomjs', [phantomScriptToRun, offSet]);

    child.stdout.on('data',function(data){

         console.log("MATCH "+decoder.write(data));

    });

    child.stderr.on('data', function (data) {
        console.log('stderr: ' + data);
    });

    child.on('exit', function (code) {
        console.log('child process exited with code ' + code);
    });

    return 0;

};



exports.Nndb = Nndb;

【问题讨论】:

  • 好吧,间谍没有正确设置——我不知道为什么。如果间谍正在工作,则函数的实际代码将没有运行。默认情况下,间谍会替换他们监视的功能,而不是监视和报告。如果您希望该功能也能正常运行,则需要执行spyOn(child_process, 'spawn').andCallThrough();之类的操作

标签: javascript node.js jasmine child-process spy


【解决方案1】:

哦,我看到了问题。您创建nndb,并且nndb 设置nndb.spawn 等于nndb.child_process.spawn。然后你在nndb.child_process.spawn 上设置了一个间谍,但是因为nndb.spawn 已经从它上面复制了出来,所以间谍并不适用于两者。当nndb.scrapeForXYZ 调用nndb.spawn 时,间谍不受影响。

试试这个:

it("spawns child process", function() {

    var nndb = new Nndb();
    var child_process =  nndb.child_process;
    spyOn(nndb, "spawn");

    //...
        expect(nndb.spawn).toHaveBeenCalledWith( //...

}

【讨论】:

  • 您好,您所观察到的是正确的。稍作修改是我仍然必须监视 child_process 而不是 nndb。 Nndb 是测试对象。删除“this.spawn = this.child_process.spawn;”行后从 nndb 构造函数并添加“spyOn(child_process, "spawn").andCallThrough();"使测试通过。谢谢您的回答。现在我必须弄清楚如何在产生的 child_process 中测试 child.stdout.on 和 child.stderr.on 方法 – arunbakt 9 小时前
猜你喜欢
  • 1970-01-01
  • 2013-01-09
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多