5

したがってuser-database、次のようなファイルがあります。

export function foo(id: number): Promise<boolean> {
  return new Promise<boolean>((resolve, reject) => {
    findSomething(id)
    .then((data) => {
      //do something with data
    })
  }
}

export function findSomething(id: number): Promise<Object> {
  return new Promise<Object> ((resolve, reject) => {
    let query = 'SELECT * FROM user';
    db.executeQuery(query);
    .then(data) => {
      if(data.length < 1) { reject(new Error('whoops')); }
      resolve(data);
    }, (err) => {
      reject(err);
    })
  })
}

そのため、Sinon を使用して外部関数 の単体テストを作成しているため、fooそれが呼び出す関数 をスタブ化したいと考えていますfindSomething。私は次のようにこれを行います:

import * as user_db from '../../src/user-database';

describe('POST /someEndpoint', () => {
  describe('when successful', () => {
    let stub;

    beforeEach(function() {
      stub = sinon.stub(user_db, 'findSomething');
    });

    afterEach(function() {
      stub.restore();
    }); 

    it('should respond with 200', function(done) {
      stub.returns(anObjectIPredefine);

      request(server)
        .post(basePath)
        .send(aPayloadIPredefine)
        .expect(200, done);
    });
  }
}

テストを実行すると、スタブに this で返すように指示しているオブジェクトが表示されませんstub.returns(anObjectIPredefine)。代わりに、実際に関数findSomethingを通常どおり実行し、dB からデータを取得します。私が間違っていることは明らかですか?私の唯一の推測は、stub = sinon.stub(user_db, 'findSomething')テストされている関数と同じスコープで定義された関数をスタブ化するための適切な構文ではないということです。ただし、代替構文が何であるかはわかりません。

4

1 に答える 1