Proxyquire: Proxy-require yargs и передайте ему значения - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть код, как показано ниже 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")
         })
    })

})

Это работает!Пойди разберись!Это, вероятно, потому что я устанавливаю значение по умолчанию в яргах.Но я не знаю, как еще заставить это работать без внесения вышеуказанных изменений!

1 Ответ

0 голосов
/ 18 февраля 2019

Это означает, что объект 'yargs' не имеет атрибутов host или port.

Попробуйте:

const chai = require('chai');
const proxyquire = require('proxyquire');
const sinon = require('sinon');
var expect = require('chai').expect;

describe("Add service", function() {
    let roo;

    beforeEach(function() {
      roo = proxyquire('../src/example.js', { 'yargs' :  {
       host: 'xx.xx.xx.xx',
       port: '7677',
      }});
     })

    it("Response should be logged", function() {
         roo.a()
    })
})
...