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

时间:2016-03-29 09:52:12

标签: javascript node.js jasmine command-line-interface readline

我在NodeJS中构建命令行应用程序,我想使用Jasmine彻底测试它。

我已经实施了promptUser()方法,该方法使用Node的readline.createInterface方法提出问题并将响应传递给回调。我想测试一下,如果用户回复了q',我的模块quit()函数就会被调用。

然而,我很难对此进行测试。我并不想直接测试readline方法,因为我没有编写该代码,但我推断如果我可以在process.stdout.write上创建一个监听器,那么enter command: 1}}打印到屏幕上我可以用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;

茉莉花测试:

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();
    });
  });
});      

我希望使这种方法有效或找到更好的方法来测试我的代码。我怀疑可能有更好/更直接的方法。

0 个答案:

没有答案