2017-08-16 18 views
0

私はamazon AWSに接続する他の2つの関数を呼び出す関数をテストしようとしています。これを念頭において、私はAWSと呼ばれる実際の関数を呼びたくはありません - 私はそれらをスタブしようとしています。しかし、私がテストを実行するたびに、私のスタブではなく実際の関数が呼び出されています。スタブ関数が呼び出されていない代わりに、実際のバージョンが呼び出されます。どうして?

私はテストにちょっと新しくて何か不足しているかもしれませんが、他の質問には解決策が見つかりませんでした。私はjasminesinonを使用してい

私のコードは次の通りである:Iドン以来、私はfunctionAfunctionBの実施を省略

export function functionA(id: string): Promise<string> {//Return Promise<string> 
//some code 
return anotherFunction(id); 
} 

export function functionB(organizationId: string): Promise<string[]> { 
//Goes to amazon do something and return Promise<string[]> 
} 

const cache = new Map<string, Set<string>>(); 
//Function to be tested - inside class XYZ 
export function functionToBeTest(events: Event[]): Promise<Event[]> { 
    cache.clear(); 
    let promises: Array<Promise<void>> = []; 
    promises = events.map((event) => { 
     let foundId: string; 
     return functionA(event.Id) 
      .then((id: string) => { 
       foundId = id; 
       if (!cache.has(id)) { 
        return functionB(id); 
       } 
      }) 
      .then((regDev) => { 
       cache.set(foundId, new Set(regDev)); 
      }) 
      .catch((err) => { 
       log.error({ err: err }); 
       return Promise.reject(err); 
      }); 
    }); 

    return Promise.all(promises) 
     .then(() => { 
      return Promise.resolve(events) 
     }); 
} 

を私がスタブしたい機能彼らが何をしているのか、どうやってそれらをスタブする必要があるのか​​心配しないでください。functionToBeTestのロジックをテストします。

私のテストスイートは以下の通りです:

import * as sinon from 'sinon'; 

describe('testing functionToBeTest()',() => { 

    let stubA: sinon.SinonStub; 
    let stubB: sinon.SinonStub; 

    beforeEach(() => { 
     stubA = sinon.stub(xyz, 'functionA'); 
     stubA.onFirstCall().resolves('1'); 
     stubA.onSecondCall().resolves('2'); 
     stubB = sinon.stub(xyz, 'functionB'); 
     stubB.onFirstCall().resolves(['1']); 
     stubB.onSecondCall().resolves(['2']); 
    }); 

    afterEach(() => { 
     stubA.restore(); 
     stubB.restore(); 
    }); 

    it('should populate the cache', (done) => { 
     let events: Event[] = [ 
      { 
       timestamp: 1, 
       eventType: EventType.PC, 
       id: '1' 
      }, 
      { 
       timestamp: 2, 
       eventType: EventType.BU, 
       id: '2' 
      } 
     ]; 
     xyz.functionToBeTest(events)// Here should call the real function and inside it should call the stub functions 
     .then((result) => { 
      //expectations 
     }) 
     .then(() => { 
      done(); 
     }) 
     .catch((err) => { 
      done.fail(err); 
     }); 
    }); 
}); 

私はこのテストを実行するとき、それはスタブ関数を呼び出すことなく、常に(それがスタブする必要があります)私の実関数の内部からのエラーを返す決して、言ったように。

誰でも助けてもらえますか?私はスタブを間違っているかもしれないが、何が間違っているのか分からない。

答えて

0

問題があることがわかりました。メソッド・スタブを呼び出す代わりに、実際のメソッド・スタブを呼び出していました。これを解決するには、元のクラスをエクスポートして、それをエクスポートし、public staticを外部で使用したいメソッドで使用しなければなりませんでした。

関連する問題