2017-05-25 41 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

我不得不不同意 - 如果一个模块使用公开暴露的内部函数,我不明白这个问题是什么 - 这就是单元测试的重点:测试孤立的功能。方法使用的“外部”功能在同一模块中似乎与我无关。你能帮我理解吗? –