使用jasmine监视节点child_process

时间:2013-12-11 15:23:46

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

我是nodejs和jasmine的新手。在一个小项目上学习javascript / node和jasmine。我试图窥探节点中的对象child_process,并看到使用指定的参数调用方法'spawn'。

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

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

  

故障:

     

1)刮取xyz spawns子进程     信息:       预期的spy spawn已经被['../src/scrape_nndb.js',0]调用,但它从未被调用过。     堆栈跟踪:       错误:使用['../src/scrape_nndb.js',0]调用预期的spy spawn但是>它从未被调用过。      在null。 (/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;

1 个答案:

答案 0 :(得分:0)

哦,我看到了问题。您创建nndbnndb设置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( //...

}