2016-07-05 108 views
0

我有一个非常简单的单元测试,看起来像这样:开玩笑惩戒方法

import ApiWrapper from '../../services/api_wrapper'; 
jest.unmock('../helper') 

describe('Helper',() => { 
    let Helper; 

    beforeEach(() => { 
     Helper = require('../helper').default; 
    }); 

    it('calls the Api Wrapper',() => { 
     Helper.help() 

     expect(ApiWrapper.help).toHaveBeenCalled(); 
    }); 

}); 

当助手看起来是这样的:

import ApiWrapper from '../services/api_wrapper' 
class Helper { 
    help() { 
     ApiWrapper.help() 
    } 
} 

export default new Helper(); 

而且ApiWrapper看起来是这样的:

class ApiWrapper { 
    static help() { 
    console.log('help!') 
    } 
} 
export default ApiWrapper; 

ApiWrapper.help()被Jest嘲笑,所以'help!'从未打印过,但测试期望失败。

export default { 
    help:() => { console.log('help!'); } 
} 

但是,由于它的工作原理,如果我们改变了进口规范(所以ApiWrapper在beforeEach进口),并重写ApiWrapper:如果我们改写ApiWrapper仅仅是一个普通的JavaScript对象像这样仍然失败成为一个Singleton类,如下所示:

class ApiWrapper { 
    help() { 
     console.log('help!'); 
    } 
}(); 

export default new ApiWrapper(); 

这是什么使Jest的嘲笑行为成为现实?

+1

有关线程的一些更多信息从这个问题:https://github.com/facebook/jest/issues/1245 – eebbesen

回答

0

如果您将require('../helper').default;移动到beforeEach()以外,它会工作吗?

您无需在每次测试前初始化它。但是,我会将ApiWrapper.help.mockClear()放在beforeEach()中以重置模拟呼叫。