У меня есть код, как показано ниже src / example.js:
var argv = require('yargs')
.usage('service 1.\nUsage: $0 -s [host] -n [port]')
.alias('s', 'host')
.alias('n', 'port')
.describe('host', 'Hostname to be used')
.describe('port', 'Port on which service will run')
.argv; //--->> Can this line even be stubbed??
function a(){
console.log(argv.host.toString());
console.log(argv.port.toString())
}
module.exports = {a}
Приведенный выше пример модульного теста, который я пытаюсь написать:
const chai = require('chai');
const proxyquire = require('proxyquire');
const sinon = require('sinon');
var expect = require('chai').expect;
describe("Add service", function() {
let roo;
let argv;
beforeEach(function() {
var argv = {}
argv.host = 'xx.xx.xx.xx';
argv.port = '7677'
roo = proxyquire('../src/example.js', { 'yargs' : { argv: argv}} );
})
it("Response should be logged", function() {
roo.a()
})
})
Когда язапустить выше, я получаю следующее сообщение об ошибке:
Add service
1) "before each" hook for "Response should be logged"
0 passing (8ms)
1 failing
1) Add service "before each" hook for "Response should be logged":
TypeError: Cannot read property 'toString' of undefined
at a (src/example.js:14:31)
Что я здесь не так делаю ??
РЕДАКТИРОВАТЬ: Итак, если я напишу свой src / example.js, как показано ниже:
var argv = require("yargs")
.option('host', {
alias: 's',
demand: false,
describe: 'Hostname to be used',
default: "xx.xx.xx.xx"
})
.option('port', {
alias: 'n',
demand: true,
describe: "sme port",
default: "7677"
})
.help()
.alias('help', 'h')
.argv
function a(done){
console.log(argv.machineHost.toString());
console.log(argv.servicePort.toString())
done(argv.machineHost)
}
module.exports = {a}
И напишите тестовый пример, как показано ниже:
const chai = require('chai');
const proxyquire = require('proxyquire');
const sinon = require('sinon');
var expect = require('chai').expect;
describe("Add service", function() {
let roo;
let argv;
beforeEach(function() {
roo = proxyquire('../src/example.js', {} );
})
it("Response should be logged", function() {
roo.a(function(resp){
chai.expect(resp).to.equal("xx.xx.xx.xx")
})
})
})
Это работает!Пойди разберись!Это, вероятно, потому что я устанавливаю значение по умолчанию в яргах.Но я не знаю, как еще заставить это работать без внесения вышеуказанных изменений!