2017-05-25 54 views
1

這裏的功能是我moduleA.ts玩笑,戲弄不工作

我想嘲笑genName功能和測試getMessage功能

const getMessage =(): string => { 
    return `Her name is ${genName()}`; 
}; 

function genName(): string { 
    return Math.random() > 0.5 ? 'emilie' : 'novaline'; 
} 

export default { 
    getMessage, 
    genName 
} 

這裏是我的測試文件:

import moduleA from '../moduleA'; 

moduleA.genName = jest.fn(() => 'mrdulin'); 

describe('mock function',() => { 

    it('t-0',() => { 
    expect(jest.isMockFunction(moduleA.genName)).toBeTruthy(); 
    expect(moduleA.genName()).toBe('mrdulin'); 
    }); 

    it('t-0.5',() => { 
    expect(jest.isMockFunction(moduleA.genName)).toBeTruthy(); 
    }); 

    it('t-1',() => { 

    expect(moduleA.getMessage()).toBe('Her name is emilie'); 
    expect(moduleA.genName).toHaveBeenCalled() 


    }); 

}); 

但它似乎不是模擬genName功能成功:

FAIL jest-examples/__test__/mock-function-0.spec.ts 
    ● mock function › t-1 

    expect(received).toBe(expected) 

    Expected value to be (using ===): 
     "Her name is emilie" 
    Received: 
     "Her name is novaline" 

     at Object.it (jest-examples/__test__/mock-function-0.spec.ts:18:34) 
     at Promise.resolve.then.el (node_modules/p-map/index.js:42:16) 
     at process._tickCallback (internal/process/next_tick.js:109:7) 

    mock function 
    ✓ t-0 (3ms) 
    ✓ t-0.5 
    ✕ t-1 (14ms) 

Test Suites: 1 failed, 1 total 
Tests:  1 failed, 2 passed, 3 total 
Snapshots: 0 total 
Time:  0.152s, estimated 1s 
Ran all test suites related to changed files. 

但我確定已調用moduleA.genName函數。

PASS jest-examples/__test__/mock-function-0.spec.ts 
    mock function 
    ✓ t-0 (2ms) 
    ✓ t-0.5 (1ms) 
    ✓ t-1 (1ms) 

Test Suites: 1 passed, 1 total 
Tests:  3 passed, 3 total 
Snapshots: 0 total 
Time:  0.148s, estimated 1s 
Ran all test suites related to changed files. 

回答

0

我假設你想嘲笑調用Math.random的原因。爲什麼不嘲笑它:

Math.random =() => 0 
expect(moduleA.getMessage()).toBe('Her name is novaline') 
Math.random =() => 1 
expect(moduleA.getMessage()).toBe('Her name is emilie') 

在沙盒試運行也沒有辦法,這會干擾任何其他測試

+0

合理的問題表示,但讓我們假設一個通用的解決方案可能從長遠來看更有用。 –

+0

好吧然後答案是,你應該只嘲笑外部依賴,你不應該模擬你想測試的模塊的一部分。 –

+0

我不得不不同意 - 如果一個模塊使用公開暴露的內部函數,我不明白這個問題是什麼 - 這就是單元測試的重點:測試孤立的功能。方法使用的「外部」功能在同一模塊中似乎與我無關。你能幫我理解嗎? –