2017-11-12 11 views
0

ネストされたconsole.errorを冗談単位テストで模擬するにはどうすればよいですか?私の試みでJS:jestJSユニットテストでネストされた関数を模擬する方法は?

(下記参照)私はあなたが呼んでいる、エラーこの行でjest.fn() value must be a mock function or spy. Received: undefined

機能

_onSubmit = (event) => { 
    event.preventDefault() 
    const { username, password } = this.state 

    return this.props.createUserMutation({ 
    variables: { username, password } 
    }).then(response => { 
    const token = response.data.createUser.token 
    if (token) { 
     // do something 
    } else { 
     console.error('No token recieved') 
    } 
    }) 
} 

テスト

it('_onSubmit() should log error, if no token is recieved', (done) => { 
    console['error'] = jest.fn() 

    const createUserMutation =() => { 
    return Promise.resolve({ 
     data: { 
     createUser: { token: undefined } 
     } 
    }) 
    } 
    const wrapper = shallow(<CreateAccount 
    createUserMutation={createUserMutation} 
    />) 

    wrapper 
    .update() 
    .find(Form) 
    .props() 
    .onSubmit({ preventDefault:() => {} }) 
    .then(() => { 
     expect(console.error()).toHaveBeenCalledWith('No token recieved') 
     done() 
    }) 
}) 

答えて

1

を得ますかこの関数をexに渡すのではなく、console.error関数

expect(console.error()).toHaveBeenCalledWith('No token recieved')

代わりに結果の、あなたがそうのような関数自体を渡したい:あなたは未定義の取得理由PECTは、それがこのfnが何も返さないので、だ

expect(console.error).toHaveBeenCalledWith('No token recieved')

また、グローバルコンソール機能を模擬しようとしているので、モック設定を次の行に沿って変更する必要があります。

global.console.error = jest.fn()

+0

いつグローバル化する必要がありますか?グローバルコードを使用せずにコードが動作しています... – user3142695

+0

申し訳ありません、それはあなたのためにそれのように働いた知って良い!モジュールのロード方法によっては、現在のスコープ内のconsole.logを上書きしている可能性があります。 –

関連する問題