2017-08-21 25 views
1

我在使用mochaJS編寫單元測試代碼時遇到了一些問題。這是我的代碼:如何在NodeJS中嘲笑單元測試中的用戶輸入?

//index.js 
var query = require('cli-interact');// helper tools for interacting synchronously with user at command line. 

module.exports = function main() { 
    while (true){ 
    let choice = query.getNumber("plz choice from(1~3):");//waiting for user's input; 
    } 
    if(choice === 3){ 
     console.log("you entered 3"); 
    } 
//...other code 
} 

//test_spec.js 
var chai = require("chai"); 
var sinon = require("sinon"); 
var sinonChai = require("sinon-chai"); 
var expect = chai.expect; 
chai.use(sinonChai); 
var main = require("../index.js"); 
describe("test input ", function(){ 
    sinon.spy(console, 'log'); 

    it("enter 3", function(){ 
     main(); 
     //now the test code block here, I want to automatically input 3,but don't know how. 
     let result = console.log.calledWith("you entered 3") 
     expect(result).to.equal(true); 
    }); 

}); 

正如上面的代碼示出了,當運行測試情況下,終端顯示一條線「PLZ從(1〜3)的選擇:」並等待我的輸入,一旦I型3並進入,測試用例會通過。

現在我想讓這個過程自動化,我該怎麼做?

回答

1

首先,我不明白'無限while循環內'query.getNumber'的需要。

let choice = query.getNumber("plz choice from(1~3):");//waiting for user's 

如果刪除了,可以使用一些robo節點模塊來實現此目的。 檢查robotjs https://www.npmjs.com/package/robotjs

index.js

var query = require('cli-interact'); 
    let main =() => { 
     let choice; 
     while (choice != 3) { 
      choice = query.getNumber("plz choice from(1~3):"); 
      console.log('your choice is : ' + choice); 
      if (choice === 3) { 
       console.log("you entered 3"); 
      } 
     } 
    }; 
    module.exports = main; 

test_spec.js

var chai = require("chai"); 
var sinon = require("sinon"); 
var sinonChai = require("sinon-chai"); 
var expect = chai.expect; 
chai.use(sinonChai); 
var main = require("../index.js"); 
var robot = require("robotjs"); 

var roboInput = (input) => { 
    robot.typeString(input); 
    robot.keyTap("enter"); 
}; 
var roboInputArr = (inputs) => { 
    inputs.forEach(ip =>{ 
     roboInput(ip); 
    }); 
}; 
describe("test input ", function() { 
    sinon.spy(console, 'log'); 
    it("enter 3", function() { 
     roboInputArr([1,2,3]); 
     main(); 
     let result = console.log.calledWith("you entered 3") 
     expect(result).to.equal(true); 
    }); 
}); 
test input 
----------- 
enter 3: 
plz choice from(1~3):1 
your choice is : 1 
plz choice from(1~3):2 
your choice is : 2 
plz choice from(1~3):3 
your choice is : 3 
you entered 3 
Pass 
+0

query.getNumber()是從模塊 'CLI-相互作用' 一個API,可以在這裏找到(https://www.npmjs.com/package/cli-interact),它可以同步接受用戶的輸入。 –

+0

爲什麼你想要在無限循環內(while(true))?它不會退出循環,並不斷要求用戶輸入 –

+0

事實是,有更多的選擇,其中一個要求用戶添加學生的成績到數據庫,我假設將有多個學生,用戶輸入一個學生的成績,它會回到主要功能並詢問用戶是否想要添加更多成績或退出課程(選擇3)。 –