2016-10-12 6 views
1

私のテスト対象の関数はおおよそ次のようになります。チャイとスロンを使ったメソッドの中で約束を外す

function doThing(data, callback) { 

    externalService.post('send').request(data) 
     .then(() => { 
      if (callback) { callback(); } 
     }) 
     .catch((message) => { 
      logger.warn('warning message'); 
      if (callback) { callback(); } 
     }); 
    } 

私はチャイとシノンを使ってこれをテストしようとしています。

私はさまざまなガイドに従って試しましたが、私の現在の呪文は次のようになります。

const thingBeingTested = require('thing-being-tested'); 
const chai = require('chai'); 
const sinon = require('sinon'); 
require('sinon-as-promised'); 
const sinonChai = require('sinon-chai'); 
const expect = chai.expect; 

var chaiAsPromised = require('chai-as-promised'); 
chai.use(chaiAsPromised); 
chai.use(sinonChai); 

describe('The Thing',() => { 
    it('should run a callback when requested and successful', done => { 

    const externalService = { post: { request: sinon.stub() } }; 
    const callback = sinon.spy(); 

    externalService.post.request.resolves(callback); 

    doThing({...}, callback); 
    expect(callback).to.have.been.called; 
    done(); 
    }); 
}); 

私はを正しくスタブアウトできません。どんな助けでも大歓迎です。

私は完全にチャイとシノンに新しいです - 完全に何か愚かなことをすることを期待しています。

+0

ことにより、元のpostを復元することを忘れないでください、あなたは、プロキシのnodejsが必要であること、[proxyquire](https://github.com/thlorenz/proxyquire)を使用して考えがありますテスト中に依存関係を上書きできるようにするには? 'nodejs'でテストするときに使う便利なツールで、私の意見ではテストを簡単にします。 – hyprstack

+0

ありがとう@hyprstack - 私はそれを聞いたことがない。私はこのユースケース(私の例では私は1つのテストを持っていましたが、もちろん、実行する必要があるいくつかの他のものがあります)に意味があるかどうかを見てみましょう。 – Toby

答えて

1

doThing機能には、const externalServiceへのアクセス権がありません。あなたの主なファイルは、

const externalService = require('./external_service'); 

のようになります。

describe(...,() => { 
    it(...,() => { 
     // adjust the path accordingly 
     const externalService = require('./external_service'); 

及びその方法モック:

sinon.stub(externalService, 'post').returns({ 
    request: sinon.stub().resolves(callback) 
}); 

次にあなたがdoThingを呼び出し、結果を分析することができますが、あなたも同じexternalServiceを取得する必要がありますあなたのテストで

テストが完了したら、

externalService.post.restore(); 
関連する問題