2013-12-14 4 views
0

Я получаю ошибку ниже при попытке выполнить тест на жасмин-узел.ошибка дочернего процесса узла jasmine

Я пытаюсь проверить следующие действия кода JavaScript

var StringDecoder = require('string_decoder').StringDecoder; 
var decoder = new StringDecoder('utf8'); 

Nndb = function(child_process) { 
    this.child_process = child_process; 
}; 

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

    var child = this.child_process.spawn('phantomjs', [phantomScriptToRun, offSet]); 
    child.stdout.on('data',function(data){ 

     console.log(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; 

со следующей тестовой спецификацией:

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

describe("Verify", function() { 

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

     var stdout = { 
      on: function() {} 
     }; 

     var child_process = { 
      stdout: stdout, 
      spawn: function(){return this;} 
     }; 

     spyOn(child_process,"spawn").andReturn(child_process); 
     spyOn(child_process, "stdout").andReturn(stdout); 

     var nndb = new Nndb(child_process); 

     nndb.invokePhantomProcess('../src/TDDQuestion.js', 0); 
     expect(child_process.spawn).toHaveBeenCalledWith('phantomjs',['../src/TDDQuestion.js',0]); 

    }); 


}); 

и получаю ошибку:

enter Stacktrace: 
TypeError: Object function() { 
spyObj.wasCalled = true; 
spyObj.callCount++; 
var args = jasmine.util.argsToArray(arguments); 
spyObj.mostRecentCall.object = this; 
spyObj.mostRecentCall.args = args; 
spyObj.argsForCall.push(args); 
spyObj.calls.push({object: this, args: args}); 
return spyObj.plan.apply(this, arguments); 
} has no method 'on' 
    at Nndb.invokePhantomProcess 

(/Users/.../src/TDDQuestion.js:11:18) 
at null.<anonymous> (/Users/.../spec/TDDQuestionSpec.js:21:14) 

я вижу метод «на 'присутствует в объекте stdout в спецификации теста.

Я также заметил, что при изменении строки в TDDQuestion.js от

child.stdout.on //returns a function causing the error 

в

child.stdout().on //returns the stdout object with the 'on' method 

решает проблему.

ответ

0

Снятие шпионажа на стандартный вывод и рассмотрение его как имущества (которое оно есть) решает проблему. Шпионаж применяется только к свойствам, которые являются функциями метода.

Я вставляю исправленный TDDSpecQuestion.js здесь.

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

describe("Verify", function() { 

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


     var stdout = { 
      on: function() {} 
     }; 
     var stderr = { 
      on: function() {} 
     } 

     var child_process = { 
      stderr: stderr, 
      stdout: stdout, 
      spawn: function(){return this;}, 
      on: function(){} 
     }; 
     debugger; 
     spyOn(child_process,"spawn").andReturn(child_process); 
     var nndb = new Nndb(child_process); 

     nndb.invokePhantomProcess('../src/TDDQuestion.js', 0); 
     expect(child_process.spawn).toHaveBeenCalledWith('phantomjs',['../src/TDDQuestion.js',0]); 

    }); 


}); 
Смежные вопросы