Как исправить sinon.stub (). Resolves () кидает TypeError <method>это не функция - PullRequest
0 голосов
/ 28 апреля 2019

Редактировать: Решением было удалить let transport =, а затем создать новый экземпляр Mailgun и затем создать новый объект MailgunTransport.

describe('Test MailgunTransport returns MailgunResponse', async () => {  
  let mailgunResponse = new MailgunResponse(message, {});

  sinon.stub(MailgunTransport.prototype, 'sendMessage').resolves(mailgunResponse);

  let apiKey = '';
  let domain = '';

  let mailgunTransport = new Mailgun({ apiKey, domain });
  let transport = new MailgunTransport(mailgunTransport);

  ...
});

Кто-то с полномочиями, пожалуйста, отметьте как решенный Спасибо.


Я настраиваю модульное тестирование с помощью sinon и не могу получить работающую заглушку.

Попробовал и заглушку, и издеваться без успеха Метод mailer.send (message) возвращает transport.sendMessage (message). На основании сообщения об ошибке «TypeError: this.transport.sendMessage не является функцией», похоже, заглушка не работает.

Контрольный пример

// Test Case
describe('Test MailgunTransport returns MailgunResponse', () => {  
  let mailgunResponse = new MailgunResponse(message, {});
  let transport = sinon.stub(MailgunTransport.prototype, 'sendMessage')
    .resolves(mailgunResponse);

  // let transport2 = sinon.mock(MailgunTransport).expects('sendMessage').once().resolves(mailgunResponse);

  let mailer = new Mailer(
    <any> transport,
    new Email('system@test.com', 'System'),
  );

  let response = mailer.send(message);

  describe('assertInstanceOf', () => {
    it('MailgunResponse.class', () => {
      expect(response).to.be.an.instanceof(MailgunResponse);
    });
  });
});

Mailer.ts

import Email from './Email';
import Message from './Message';
import MockResponse from './Transport/MockResponse';
import ResponseInterface from './Transport/ResponseInterface';
import TransportInterface from './Transport/TransportInterface';

export default class Mailer {
  private transport: TransportInterface;
  private delivery: boolean;

  constructor(
    transport: TransportInterface,
    delivery: boolean = true
  ) {
    this.transport = transport;
    this.delivery = delivery;
  }

  public send(message: Message): Promise<ResponseInterface> | ResponseInterface {
    if (this.delivery) {
      return this.transport.sendMessage(message);
    }

    return new MockResponse(message);
  }
}

MailgunTransport.ts

...

export default class MailgunTransport implements TransportInterface {
  private mailgun: Mailgun;

  constructor(mailgun: Mailgun) {
    this.mailgun = mailgun;
  }

  public async sendMessage(message: Message): Promise<MailgunResponse> {
    let data = {}

    return new MailgunResponse(message, await this.mailgun.messages().send(data, (error, body) => {
      console.error(error);
      console.log(body);
    }));
  }
}

Ожидаемый результат - тупая версия метода 'sendMessage', но я продолжаю получать ошибку. Я не уверен, что мне не хватает.

...