JavaScript-使用Jasmine测试NodeJS readline.createInterface的实现

for*_*9er 5 javascript readline command-line-interface node.js jasmine

我正在NodeJS中构建一个命令行应用程序,我想使用Jasmine对其进行彻底的测试。

我已经实现了一个promptUser()使用Node readline.createInterface方法提出问题并将响应传递到回调中的方法。我想测试一下,给定用户响应“ q”,quit()是否调用了我模块的功能。

但是,我正在努力测试。我真的不想readline直接测试该方法,因为我没有编写该代码,但是我认为,如果可以在其上创建一个侦听器,process.stdout.write那么当它enter command:被打印到屏幕上时,我就可以响应process.stdin.write("q\n")并触发if / else逻辑。

我简化了代码,但是应该解释一下我要做什么:

模块源代码:

var Cli = function() {

  var rl = require('readline');
  var self = this;

  Cli.prototype.promptUser = function() {
    var inputHandler = rl.createInterface(process.stdin, process.stdout);
    inputHandler.question('enter command: ', function(answer) {
      if (answer === 'q') {
        self.quit();
      };
    });
  };

  Cli.prototype.quit = function() {
    // doSomething
  };
};

module.exports = Cli;
Run Code Online (Sandbox Code Playgroud)

茉莉花测试:

var Cli = require('Cli');

describe('My application.', function() {

  beforeEach(function() {
    cli = new Cli();
    spyOn(cli, 'quit');
  });

  describe('Cli #promptUser', function() {
    it('input of lower-case q calls cli.quit()', function() {  
      process.stdout.once('write', function() {
        process.stdin.write("q\n");
      });
      cli.promptUser();
      expect(cli.quit).toHaveBeenCalled();
    });
  });
});      
Run Code Online (Sandbox Code Playgroud)

我正在寻找使这种方法可行或找到更好的方法来测试我的代码的方法。我怀疑可能有更好/更直接的方法。