我在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();
});
});
});
我希望使这种方法有效或找到更好的方法来测试我的代码。我怀疑可能有更好/更直接的方法。