2017-12-20 12 views
0

ノードの組み込み関数require.resolveをjestテストスイートで模擬したいと思います。ここで問題on repl.itとコード自体の作業例:冗談での黙示とテストrequire.resolveの呼び出し

被験者(例として):

const requirer =() => { 
    try { 
    return require.resolve('./add') 
    } catch (error) { 
    console.error('failed to find a module') 
    } 
} 

module.exports = requirer 

テストスイート:すべてがあるテストスイート宣言の内部

const requirer = require('./requirer') 

describe('attempt to mock require.resolve',() => { 
    it('does not work',() => { 
    require.resolve = jest.fn(arg => `./${arg}`) 
    console.log(
     'is require.resolve mocked', 
     jest.isMockFunction(require.resolve)) // will say true 

    requirer() 

    expect(require.resolve).toHaveBeenCalledTimes(1) 
    expect(require.resolve).toBeCalledWith('') 
    }) 
}) 

OK(jest.isMockFunction(require.resolve)の出力を参照)とモックが動作します。しかし、テスト対象のためにはrequire.resolveは元の機能性を残しています。

この問題のため、これは純粋な単体テストではありません。

たとえば、私が模倣した場合、process.exitはすべて正常に動作します。

答えて

0

だから、ない完璧なソリューション、

を予想通りrequire.resolve作品の嘲笑バージョンをダウン渡すテストスイートになりまし

const requirer = (resolver) => { 
    try { 
    return resolver('./add') 
    } catch (error) { 
    console.error('failed to find a module') 
    } 
} 

module.exports = requirer 

に(DI)require.resolveを注入する方が簡単ですconst requirer = require( './ requirer')

describe('attempt to mock require.resolve',() => { 
    it('works',() => { 
    require.resolve = jest.fn(arg => `./${arg}`) 
    console.log(
     'is require.resolve mocked', 
     jest.isMockFunction(require.resolve)) // will say true 

    requirer(require.resolve) 

    expect(require.resolve).toHaveBeenCalledTimes(1) 
    // expect(require.resolve).toBeCalledWith('') 
    }) 
}) 
関連する問題