【问题标题】:Why isn't sinon replacing the actual function call?为什么 sinon 不替换实际的函数调用?
【发布时间】:2018-09-19 22:45:33
【问题描述】:

我的功能是:

const PhoneNumber = require('awesome-phonenumber');
const twilio = require('twilio')(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
const { twiml } = require('twilio');

exports.incoming = (requestBody) => {
  const MessagingResponse = twiml.MessagingResponse;
  const VoiceResponse = twiml.VoiceResponse;
  const pn = new PhoneNumber(requestBody.Body, 'US');
    return global.db.Conference.create({})
      .then((dbCreate) => {
        conferenceId = dbCreate.id;
        // Call originator
        return twilio.calls.create({
          to: requestBody.From,
          from: requestBody.To,
          url: `${process.env.API_URL}/calls/conference?id=${conferenceId}`
        });
      })

我的测试是:

const _ = require('lodash');
const sinon = require('sinon');
const twilio = require('twilio')(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
const { twiml } = require('twilio');

const SmsController = require('../../../controllers/sms');
const twilioIncomingSmsReq = require('../../mocks/twilioIncomingSmsReq');

describe.only('Sms Controller', () => {
  let messagingResponseMessageStub;
  let conferenceCreateStub;

  beforeEach(() => {
    messagingResponseMessageStub = sinon.stub(twiml.MessagingResponse.prototype, 'message').returns(true);
    conferenceCreateStub = sinon.stub(global.db.Conference, 'create').resolves({ id: 1 });

    return;
  });

  afterEach(() => {
    messagingResponseMessageStub.restore();
    conferenceCreateStub.restore();
    return;
  });

  it.only('should call the originator and recipient', () => {
    let requestBody = _.clone(twilioIncomingSmsReq);
    console.log(twilio.calls);
    let twilioDialStub = sinon.stub(twilio.calls, 'create').resolves(true);
    console.log(twilio.calls);

    return SmsController.incoming(requestBody)
      .then(() => {
        sinon.assert.calledWith(twilioDialStub, {
          to: requestBody.From,
          from: requestBody.To,
          url: `${process.env.API_URL}/calls?id=1`
        });

        sinon.assert.calledWith(twilioDialStub, {
          to: '+number',
          from: requestBody.From,
          url: `${process.env.API_URL}/calls?id=1`
        });

        twilioDialStub.restore();

        return;
      });
  });
});

但在我的代码中,调用了实际的 twilion.calls.create 函数。不是存根。我做错了什么?

【问题讨论】:

    标签: node.js unit-testing twilio sinon stub


    【解决方案1】:

    twilio 引用这些模块中的不同对象。 require('twilio') 是工厂函数。即使使用相同的参数require('twilio')(...) !== require('twilio')(...) 调用它,它也会创建一个新对象。

    考虑导出twilio 实例,至少用于测试目的:

    const twilio = require('twilio')(process.env.TWILIO_ACCOUNT_SID, 
    ...
    exports.twilio = twilio;
    

    【讨论】:

    • 你是说我应该从哪里导出?
    • 您需要从您在incoming 函数中使用它的模块中导出twilio。我猜是.../controllers/sms。
    猜你喜欢
    • 2020-09-07
    • 2021-09-04
    • 2019-07-17
    • 2020-09-20
    • 1970-01-01
    • 2021-06-16
    • 2013-02-14
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多