2017-12-20 2 views
0

노드의 내장 함수 require.resolve을 조롱 테스트 스위트로 조롱하고 싶습니다. 여기에 문제가 on repl.it와 코드 자체의 작동 예 :조커 (jest test)를 조롱하고 테스트합니다.

시험 대상 (예를 들어) :

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('') 
    }) 
}) 
관련 문제