2017-03-02 14 views
5

私はクラスAProviderがあり、'./b.provider'が必要です。私の要求されたクラスをスタブしていないプロクシーク

const BProvider = require('./b.provider'); 

class AProvider { 
    static get defaultPath() { 
    return `defaults/a/${BProvider.getThing()}`; 
    } 
} 

module.exports = AProvider; 

b.provider.jsa.provider.jsに隣接しており、

私は次のように ./b.providerをモックとし proxyquireを使用して私のテストで
global.stuff.whatever = require('../models').get('Whatever'); // I didn't write this! 

class BProvider { 
    static getThing() { 
    return 'some-computed-thing'; 
    } 
} 
module.exports = BProvider; 

次のようになります。

import { expect } from 'chai'; 
import proxyquire from 'proxyquire'; 

describe('A Provider',() => { 
    const Provider = proxyquire('../src/a.provider', { 
    './b.provider': { 
     getThing:() => 'b-thing' 
    }, 
    }); 

    describe('defaultPath',() => { 
    it('has the expected value',() => { 
     expect(Provider.defaultPath).to.equal('defaults/a/b-thing') 
    }); 
    }); 
}); 

私はテストBProviderを実行するときしかし、さまだ実際の'./b.provider'はスタブではなく、BProviderの参照はですがエラーを投げています。

なぜこれが機能しないのですか?

proxyquireはまだそれをスタブする前に基本的なコードを必要とし、次のようにこれが起こっている理由として

+1

'before'ステートメントでproxyquireディレクティブを宣言しようとしましたか?また、これが助けになるかどうかわからないが、この記事では、それと同時にsinonを使うと思うようだ。http://www.thoughtdelimited.org/thoughts/post.cfm/instructing-proxyquire-to-ignore-nested-requires –

+0

興味深いリンク。私は依頼が依頼されたにもかかわらず依然として起こったことを知らなかった。今タクシーでは、私が家に帰るときに解決策をテストします。ありがとう。 –

+0

さて、私は問題を解決して、私が以下に掲載する簡単な解決策を見つけました。正しい方向に私を指してくれてありがとう@ francisco.preller。 –

答えて

4

答えがあります。これは、コールスルーを有効にするためにこれを行います。

解決策は、単にに、コールスルーを明示的に禁止することです。

テストは次のようになります。このテストを実行する

import { expect } from 'chai'; 
import proxyquire from 'proxyquire'; 

describe('A Provider',() => { 
    const Provider = proxyquire('../src/a.provider', { 
    './b.provider': { 
     getThing:() => 'b-thing', 
     '@noCallThru': true 
    }, 
    }); 

    describe('defaultPath',() => { 
    it('has the expected value',() => { 
     expect(Provider.defaultPath).to.equal('defaults/a/b-thing') 
    }); 
    }); 
}); 

は完璧に動作します。

関連する問題