Proxyquire не заглушает конструктор класса - PullRequest
0 голосов
/ 15 января 2020

Когда я запускаю тест, все заглушки, которые у меня есть, работают нормально, но в constructor () {} класса EmailFactory не заглушается и возвращает ошибку, даже заглушку EmailFactoryStub .buildMail возвращает то, что я хочу (работает нормально), но не конструктор. Тест продолжает загружаться в течение длительного времени после console.log ('10 ', emailContent), и когда он заканчивается, возвращается ошибка, подобная этой:

⠦ 10 null
⠹ err : { Error: socket hang up
    at createHangUpError (_http_client.js:323:15)
    at Socket.socketOnEnd (_http_client.js:426:23)
    at Socket.emit (events.js:203:15)
    at Socket.EventEmitter.emit (domain.js:448:20)
    at endReadableNT (_stream_readable.js:1145:12)
    at process._tickCallback (internal/process/next_tick.js:63:19) code: 'ECONNRESET', response: undefined }
⠦ 7/4/CA06 -> Update employees that were repeated with masive charge

Это некоторый код файлов. Структура теста . js:

const test = require('ava');
const request = require('supertest');
const sinon = require('sinon');
const proxyquire = require('proxyquire');

let EmailFactoryStub = {}

test.beforeEach(async t => {
    sandbox = sinon.createSandbox();

    EmailFactoryStub = {
        '@global': true
    }
    server = proxyquire('../../server.js', {
        './libs/emailFactory': EmailFactoryStub,
    })
})

test.serial.cb.only('Test EmailFactory', t => {
    EmailFactoryStub.buildMail = sandbox.stub()
    EmailFactoryStub.buildMail.withArgs(sinon.match.any).returns(null)
    EmailFactoryStub = sandbox.stub()

    /*
    *On this part (request) all works fine in controller, 
    *I don't put here the vars 'employeeFixture' and 'token' 
    *to focus the main problem
    */
    request(server)
    .put(context + '/employees/batch')
    .send(employeeFixture)
    .set('Authorization', `bearer ${token}`)
    .expect(200)
    .end(function (err, res) {
        t.falsy(err, 'should not return an error')
        console.log('err :', err);
        t.end()
    })
})

Библиотека, импортированная в тест, - это / libs / emailFactory. js

const Mailgun = require('mailgun-js')

class EmailFactory {
  constructor(from, to, subject, html, text) {
    console.log('FIRST');
    // Configure email options
    this.from = from
    this.to = to
    this.subject = subject
    this.content = {}
    this.content.html = html
    this.content.text = text

    // Create mg instance
    this.mg = new Mailgun({
      apiKey: serverConfig.mail.api_key,
      domain: serverConfig.mail.domain,
      testMode: false,
      testModeLogger: logger
    })
  }

  static buildMail(contentFile, keys = [], values = []) {
    // Configure path files
    let rootPath = path.resolve('.')
    let filepath = `${rootPath}/views/${contentFile}`

    // Read files
    let content = fs.readFileSync(filepath, 'utf8')
    for (var i = 0; i < keys.length; i++) {
      content = content.replace(keys[i], values[i])
    }
    content = content.replace('currentYear', new Date().getFullYear())
    return content
  }
}

И код контроллера. js:

//controller.js
let emailContent = EmailFactory.buildMail('user_active.html', [
  'username',
  'url_login'
], [
  `${user.first_name || user.email}`,
  `${serverConfig.app.numina_server}`
])
console.log('10', emailContent);

//At this point stub works fine, because 'emailContent' returns what I put in test.

let mail = new EmailFactory(
  serverConfig.mail.sender,
  user.email,
  serverConfig.mail.subject.user_active,
  emailContent,
  emailContent
)

//And at this point does not work and return the error :(

console.log('mail :', mail);

Я читал о Требуется глобальное переопределение , но я не уверен если это действительно проблема.

...