单元测试链式承诺

时间:2019-05-10 01:29:03

标签: javascript unit-testing promise sinon

我将如何对调用已承诺的导入类的方法的类方法进行单元测试?我有以下结构:

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中的代码会更好吗?

更新

显然SomeClass是一个单例,而sinon抛出一个错误,说somePromiseMethodnon-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 个答案:

答案 0 :(得分:1)

您正在存出somePromiseMethod的{​​{1}}上存在错误的方法prototype,因此您需要存根该方法。 Sinon应该让您做类似的事情:

SomeClass