2016-08-04 12 views
0

エクスポートされた関数を含む2つのモジュールがあります。 "ModuleB"は "ModuleA"の関数を使用します。今、 "ModuleB"をテストし、 "ModuleA"から使用された関数をモックしたいと思います。モックのモジュール内でのエクスポート機能

私はバベルでES6を使用します。テストのために私はカルマとジャスミンを使います。

私はbabel-rewireとinject-loaderを使ってみましたが、うまくいきません。私はこのすべてに新しいことがあります。私はちょうど何か間違っていると思います。だから、どんな助けもありがとう!

moduleA.js

export function getResult() { 
    return realResult; 
} 

moduleB.js

import * as ModuleA from './moduleA' 

export function functionToTest() { 
    let result = ModuleA.getResult(); 
    // do stuff with result which I want to test 
} 

私のテスト

it("does the right thing",() => { 
    // I tried using rewire, but this gives me an exception: 
    ModuleB.__Rewire__('ModuleA', { 

     getResult:() => { 
      return fakeResult; 
     } 
    }); 

    let xyz = ModuleB.functionToTest(canvas, element); 
}); 

答えて

0

を見ることができる:トリックは__RewireAPI__を使用することです。

import * as ModuleB from '../ModuleB' 
import {__RewireAPI__ as ModuleBRewire} from '../ModuleA'; 

it("does the right thing",() => { 
    let moduleAMock = { 
     getResult:() => { 
      return fakeResult; 
     } 
    } 

    ModuleBRewire.__Rewire__('ModuleA', moduleAMock); 

    let xyz = ModuleB.functionToTest(); 
}); 
1

は、このライブラリに見てみましょう私はそれがまさにあなたが望むものだと思った。それが役に立てば幸い!

EDITED:

基本的に、あなたの機能を模擬するために、各テストで嘲笑を使用する必要があり、唯一の問題は、あなたが使用しなければならないということですが、あなたがモックとしたいモジュールとインポートに対して必要になります。この例を見て:

const moduleUnderTest = './moduleB.js'; 
const moduleA_fake = { getResult:() => { return "This is a fake result"; } } ; 

describe("Mocking functions",() => { 

    it('Should be Fake Result', (done) => { 

     mock.registerAllowable(moduleUnderTest); 
     mock.registerMock('./moduleA.js', moduleA_fake); 

     mock.enable({ useCleanCache: true }); 

     let ModuleB = require(moduleUnderTest); 
     let res = ModuleB.functionToTest(); 

     res.should.be.eql("This is a fake result"); 


     mock.disable(); 
     mock.deregisterAll(); 

     done(); 
    }); 

    it('Should be Real Result', (done) => { 

     let ModuleB = require(moduleUnderTest); 
     let res = ModuleB.functionToTest(); 

     res.should.be.eql("real foo"); 

     done(); 
    }); 

}); 

あなたはそれがbabel-rewireでどのように機能するかに興味がある人にとって完全な例Here

+0

これはes6とどのように機能しますか? – Ria

+1

確かに、私があなたのために作ったこの例を見てください。ライブラリがrequireと一緒に使われるようにしたというのは難しいことですから、関数をモックするテストではimportを要求するモジュールを呼び出す必要があります。 [例を参照](https://repl.it/Cjo4/0) – damianfabian

+0

ありがとう!今私はそれを使用する方法を理解しています。しかし、私はまだいくつかの問題を抱えています: 'npm install mockery 'を介してインストールし、' mock = require( 'mockery')'を介して '模擬作 'を作成しました。テストを実行するとエラーが発生しました。エラーが発生しました:./~/mockery/mockery.js モジュールが見つかりません:エラー:モジュール 'module'を解決できません。これは何ですか? – Ria