2017-01-20 9 views
1

ローカルフェッチラッパーを呼び出すはずのモジュールがあります。jestはなぜこのモジュールをモックしませんか?

// get.js 
import fetch from '../fetch' 

const get = (endpoint, token) => { 
    const headers = new Headers() 

    if (token) { 
    headers.append('Authorization', `Bearer ${token}`) 
    } 

    const init = { 
    headers, 
    method: 'GET' 
    } 

    return fetch(new Request(endpoint, init)) 
} 

export default get 
// get.test.js 
import 'isomorphic-fetch' 
import get from './get' 

describe('get',() => { 
    it('calls fetch with a request',() => { 
    // I'm expecting this spy to be called by get 
    const mockFetch = jest.fn() 
    jest.mock('../fetch',() => jest.fn(mockFetch)) 

    get('endpoint', 'token') 

    expect(mockFetch).toHaveBeenCalled() 
    }) 
}) 

しかし、私が実行したとき、それは冗談で失敗します:

expect(jest.fn()).toHaveBeenCalled() 

Expected mock function to have been called. 
GETモジュールは、私はそれをからかっなどのようなスパイを返すよフェッチラッパーを正しく呼び出すかどうかを確認するには

それではなぜそれは模造品を呼んでいないのですか?

答えて

1

問題はすべてjest.mockステートメントがコードブロックの上部に持ち上げられることです。だからあなたがテストの途中に書いても、テストの最初のステートメントとして実行され、特定の戻り値を持つ方法はありません。だからこれをいかに修正するか。まず、黙っている文がインポート文の後にあることを確認して、テストで起こっていないことを明示してください。次に、テストでモジュールをインポートします。これはあなたの模擬声明のjest.fn()の結果になります。 fetchがスパイであるため、fetchが呼び出されたことをテストできます。

import 'isomorphic-fetch' 
import get from './get' 
import fetch from '../fetch' 
jest.mock('../fetch',() => jest.fn()) 

describe('get',() => { 
    it('calls fetch with a request',() => { 
    get('endpoint', 'token') 
    expect(fetch).toHaveBeenCalled() 
    }) 
}) 
+0

しかし、ドキュメントは次のように言っています: '注:バベル・ジェストを使用すると、モックへの呼び出しは自動的にコードブロックの上部に吊り上げられます。明示的にこの動作を避けたい場合は、doMockを使用してください。 'ファイルの先頭ではなく、同じブロック内に残す必要がありますか? – vsjn3290ckjnaoij2jikndckjb

+0

申し訳ありませんが、私はこの時点で少し間違っていました。それまでは 'const mockFetch = jest.fn()'を宣言することができます。 –

関連する問題