Модульный тест для googleApi

У меня есть следующий код, и я пытаюсь создать модульный тест, чтобы убедиться, что функция sendToGoogle работает, поэтому я заглушаю метод отправки gmail.users.messages и ожидаю, что метод будет вызван методом sendToGoogle, но я получил эту ошибку

AssertionError: ожидается, что отправка будет вызвана хотя бы один раз, но она так и не была вызвана

//email.js

 const helper = require('./helper')

 /**
  * sendEmail - sends an email to a given address
  *
  * @param {String} to - The address of the recipient.
  * @param {String} from - The address of the sender.
  * @param {String} subject - subject of the email.
  * @param {String} bodyText - text of the email.
  **/
function sendEmail(to, from, subject, bodyText) {
  const oAuthClient = helper.getAuth(process.env.CLIENT_ID, process.env.PRIVATE_KEY, from);
  const emailLines = helper.createEmail(to, from, subject, bodyText);
  helper.sendToGoogle(oAuthClient, from, emailLines);
}

 module.exports.sendEmail = sendEmail;

вот helper.js, который содержит мой код

//helper.js

const {google} = require('googleapis');
const base64 = require('base-64');
const gmail = google.gmail("v1");

 /**
  * createEmail - createEmail an email message
  *
  * @param {String} to - The address of the recipient.
  * @param {String} from - The address of the sender.
  * @param {String} subject - subject of the email.
  * @param {String} bodyText - text of the email.
  * @return {String} - Message to send.
  **/

const createEmail = function (to, from, subject, bodyText) {
  const emailLines = ["Content-Type: text/plain; charset=\"UTF-8\"\n",
    "MIME-Version: 1.0\n",
    "Content-Transfer-Encoding: 7bit\n",
    "to: ", to, "\n",
    "from: ", from, "\n",
    "subject: ", subject, "\n\n",
    bodyText
  ].join('')
  const messageBase64 = base64.encode(emailLines.trim()).replace(/\+/g, '-').replace(/\//g, '_');
  return messageBase64
}
  /**
   *
   *
   * @param {String} clientKey
   * @param {String} privateKey
   * @param {String} from
   * @returns
   */
  const getAuth = function (clientKey, privateKey, from) {
    return new google.auth.JWT(
      clientKey,
      null,
      privateKey,
      ['https://www.googleapis.com/auth/gmail.send'],
      from
    );
  }
   /**
    * @param {String} oAuthClient
    * @param {String} from
    * @param {String} message
    */
   const sendToGoogle = function (oAuthClient, from, message) {
     console.log("sendtogoogle calllled")
     gmail.users.messages.send({
       auth: oAuthClient,
       userId: from,
       resource: {
         raw: message
       }
     }, function (err, resp) {
       if (!err) {
         return resp
       }
       console.error(err)

     });
   }
  module.exports.createEmail = createEmail
  module.exports.getAuth = getAuth
  module.exports.sendToGoogle = sendToGoogle

и это файл юниттеста

//email.spec.js

 it ("send to gmail",function(){
   const gmail = google.gmail("v1");
   const SendStub = sinon.stub(gmail.users.messages, 'send').returns('test')
   const result = helper.sendToGoogle("oAuthClient", from,"message")
   SendStub.should.have.been.called
  })

Ваша помощь приветствуется.


person Oday    schedule 18.12.2018    source источник
comment
какую версию синона вы используете?   -  person Muhammad Ali    schedule 18.12.2018
comment
Я использую синон версии 7.2.2   -  person Oday    schedule 19.12.2018
comment
Вызов google.gmail("v1") возвращает другой экземпляр gmail, поэтому send, который вы заглушаете в тесте, не совпадает с send, вызываемым в helper.js.   -  person Brian Adams    schedule 19.12.2018
comment
@brian-lives-outdoors Так что я могу сделать?   -  person Oday    schedule 19.12.2018
comment
Какую среду тестирования вы используете? Кроме того, вы используете импорт ES6 или требуете?   -  person Brian Adams    schedule 19.12.2018
comment
Я использую Mocha, я использую require   -  person Oday    schedule 19.12.2018


Ответы (2)


Документация Sinon не обновляется, я также потратил слишком много времени и нашел решение, которое подходит для моего случая.

    sandbox.stub(gmail.users.messages, 'send').callsFake(() => {
        return 'test';
    });
person Muhammad Ali    schedule 19.12.2018
comment
Не работает, я думаю, что это связано с экземпляром Gmail, как упоминалось в некоторых комментариях. - person Oday; 19.12.2018
comment
вы инициализировали google.gmail(v1) внутри sendToGoogle , поэтому экземпляр gmail не заглушается, вам нужно инициализировать снаружи sendToGoogle - person Muhammad Ali; 19.12.2018
comment
Что ты имеешь в виду? Вы имеете в виду, что мне нужно сделать const gmail = google.gmail(v1) вне области действия sendToGoogle? - person Oday; 19.12.2018
comment
да, это лучший способ инициализировать вверху страницы - person Muhammad Ali; 19.12.2018
comment
Я отредактировал сообщение, так что, возможно, у вас есть четкая картина. - person Oday; 19.12.2018

Я исправил проблему, экспортировав Gmail и импортировав ее в свой тестовый файл, поэтому я заглушил тот же экземпляр.

person Oday    schedule 19.12.2018