Модульное тестирование приковано обещаниями - PullRequest
0 голосов
/ 10 мая 2019

Как мне провести модульное тестирование метода класса, который вызывает метод импортированного класса, который является обещанием?У меня есть следующая структура:

import { SomeClass } from 'some-library';

class MyClass extends AnotherClass {
  myMethod() {
    const someClass = new SomeClass();

    return someClass.somePromiseMethod('someParam')
      .then(response => response.data)
      .then(response => {
        // Do stuff
      });
  }
}

У меня есть следующий тест

describe('myMethod', () => {
  it('does something', async () => {
    const inst = new MyClass();
    const stub = sinon.stub(SomeClass, 'somePromiseMethod')
      .resolves(Promise.resolve({
        data: [],
      }));

    await inst.myMethod();

    expect(stub.callCount).to.equal(1);
  });
});

Который все еще довольно прост, так как я не уверен, как подойти к этому.Было бы лучше разбить код на then s?

UPDATE

Видимо SomeClass - это одиночный код, а sinon выдает ошибку, говоря somePromiseMethod это non-existent own property.Я изменил заглушку так, чтобы она вызывала prototype, и теперь вызывается заглушка.

class MyClass extends AnotherClass {
  myMethod() {
    const someClassInstance = SomeClass.getInstance();

    return someClassInstance.somePromiseMethod('someParam')
      .then(response => response.data)
      .then(response => {
        // Do stuff
      });
  }
}


describe('myMethod', () => {
  it('does something', async () => {
    const inst = new MyClass();
    const stub = sinon.stub(SomeClass.prototype, 'somePromiseMethod')
      .resolves(Promise.resolve({
        data: [],
      }));

    await inst.myMethod();

    expect(stub.callCount).to.equal(1);
  });
});

Теперь, с тех пор, как второй then просто вернет data, я мог бы просто поставить //Do stuff в отдельной функции и проверьте это.

1 Ответ

1 голос
/ 10 мая 2019

Вы удаляете неправильный метод somePromiseMethod существует на prototype из SomeClass, поэтому вам нужно вместо этого заглушить.Синон должен позволить вам сделать что-то вроде:

const stub = sinon.stub(SomeClass.prototype, 'somePromiseMethod')
  // You may be able to remove the Promise.resolve as well, as I think resolves does this for you
  .resolves({
    data: [],
  });
...