2017-04-06 33 views
4

,我想测试看起来如下ES6模块:有什么办法可以用Jest来模拟私人功能吗?

function privateFunction() { 
    ... 
} 
export function publicFunction() { 
    ... does something ... 
    privateFunction() 
    ... does something else ... 
} 

我使用JEST为我的单元测试,我试图找到一种方法来测试publicFunction和嘲笑它避免privateFunction的执行,但我无法在模拟尝试中取得成功。任何想法?

+0

你问如何为私有函数编写测试,或者如何模拟私有函数? –

+0

好点。模拟解决方案就足够了,但嘲笑/测试都需要一个解决方案来访问测试中的私有函数。 – matteo

回答

6

我发现了一种方法来模拟我的私人功能,通过使用babel-plugin-rewire模块。

的package.json我有以下几点:

"devDependencies": { 
    ... 
    "babel-plugin-rewire": "1.0.0-beta-5", 
    "babel-jest": "18.0.0", 
    ... 

.babel.rc我有以下几点:

{ 
    "presets": [ 
    "es2015", 
    "stage-0", 
    "react" 
    ], 
    "env": { 
    "test": { 
     "plugins": [ 
     "babel-plugin-rewire" 
     ] 
    } 
    }, 
    ... 

在这一点上我能够嘲笑私人功能:

import * as moduleToTest from './moduleToTest.js' 

describe('#publicFunction',() => { 
    it('mocks private function',() => { 
    moduleToTest.__Rewire__('privateFunction',() => { console.log('I am the mocked private function') }) 
    ... 
    }) 
}) 
+0

我不清楚我该如何测试这个嘲弄的功能。我将如何在expect()的上下文中使用rewired函数? – Lounge9

2

没有办法通过JavaScript的本质。该函数绑定到模块的范围,所以无法知道这个函数是否存在于外部,所以没办法访问这个函数,最后也没办法嘲笑它。

也许更重要的是,您不应该测试被测对象的内部,而只测试公共API。因为这是重要的一切。只要公共API保持稳定,没有人关心内部是如何完成的。

+3

当我使用“tape”和“ava”时,我可以通过使用“babel-plugin-rewire”来模拟私人功能。关于测试私有函数我不同意,因为它违反了TDD的原则。 – matteo

相关问题