2016-12-11 9 views
4

モック関数の定義方法がいくつか違っていて、すべての試行に失敗しました。私は次のようにそれを定義しようとすると:それは、次のエラーを返しjest.mock(モジュール)とjest.fn()の違い

var spy = jest.mock('../src/data/server',()=> ({server: {report: jest.fn()}})); 
expect(spy).toBeCalledWith(id, data,() => {...},() => {...}); 

:として私はモックを定義する場合

expect(jest.fn())[.not].toBeCalledWith() 
jest.fn() value must be a mock function or spy. 
Received: undefined 

jest.mock('../src/data/server',()=> ({server: {report: jest.fn()}})); 
expect(server.report.mock).toBeCalledWith(id, data,() => {...},() => {...}); 

私はこのエラーを取得する

expect(jest.fn())[.not].toBeCalledWith() 
    jest.fn() value must be a mock function or spy. 
    Received: 
     object: {"addMatchers": [Function anonymous], "autoMockOff": [Function anonymous], "autoMockOn": [Function anonymous], "clearAllMocks": [Function anonymous], "clearAllTimers": [Function anonymous], "deepUnmock": [Function anonymous], "disableAutomock": [Function anonymous], "doMock": [Function anonymous], "dontMock": [Function anonymous], "enableAutomock": [Function anonymous], "fn": [Function anonymous], "genMockFn": [Function bound getMockFunction], "genMockFromModule": [Function anonymous], "genMockFunction": [Function bound getMockFunction], "isMockFunction": [Function isMockFunction], 
"mock": [Function anonymous], "resetModuleRegistry": [Function anonymous], "resetModules": [Function anonymous], "runAllImmediates": [Function anonymous], "runAllTicks": [Function anonymous], "runAllTimers": [Function anonymous], "runOnlyPendingTimers": [Function anonymous], "runTimersToTime": [Function anonymous],"setMock": [Function anonymous], "unmock": [Function anonymous], "useFakeTimers": [Function anonymous], "useRealTimers": [Function anonymous]} 

私の3回目の試みとして、モックを定義しました以下のように:

const st = require.requireActual('../src/data/server',()=> ({server: {report: jest.fn()}})); 
st.report = jest.fn(); 
expect(st.report).toBeCalledWith(id, data, () => {...},() => {...}); 

そして、私はこのエラーを取得する:

expect(jest.fn()).toBeCalledWith(expected) 
Expected mock function to have been called with: 
    ["1033083fe", {"address": "test address", "affiliation": "testaaa", 
    "city": "testcity", "copyright": true, "country": "testcountry", "email": "[email protected]", "message": "testmessage", 
    "name": "testname", "phone": "1234567890", "zipcode": "12345"}, [Function anonymous], [Function anonymous]] 
But it was not called. 

私が問題とどのようにモックを定義し、これらの3つの方法が異なっているのだろうか?

P.S.コードはここで見つけることができます:Write a Unit test in Jest for a React form

答えて

6

最初の例では、モジュール'../src/data/server'が他のモジュールにインポートされたときに{server: {report: jest.fn()}}となります。次の行では、serverを使用してみてください。問題は、あなたがモックするモジュールを決してインポートしないことです。テストするモジュールのserver{server: {report: jest.fn()}}であるかもしれませんが、テストサーバーの中では決してそれをインポートしないのでundefinedです。これを修正するには、それをインポートする必要もあります。第2の例で

​​

それだけjestを返しjest.mockようシーム。

最後の例は、st.reportに決してコールしないために失敗します。

メインの質問に戻る。あなたが唯一のパスパラメータでそれを呼び出す、または関数の戻り値を使用すると、2番目のパラメータとしてそれを与えることができるときjest.mockjest.fn

jest.mockの違いは、どちらかだけjest.fnで一つのモジュールを置き換えます。だからあなたの最初の例では、あなたがファイルをテストしたいとき、またはテスト自体で'../src/data/server'をインポートすると{server: {report: jest.fn()}}になります。

jest.fn()が表示されます。これはスパイを返します。スパイは、それに加えられた各呼び出しと各パラメータを記憶する機能です。

import server from './data/server' 

server.report('test123') 

このコールは、あなたがコントロールすることができるものと'./data/server'にこの依存関係を模擬する必要が正しいパラメータで行われたことをテストするには:

はあなたがしたいテストモジュールを持っているとしましょう。ここでは何が起こる

import server from '../src/data/server' 
import fileToTest from '../src/fileToTest' 
jest.mock('../src/data/server',()=> ({server: {report: jest.fn()}})); 
expect(server.report.mock).toBeCalledWith('test123'); 

は、すべてのインポート前のものは、あなたのモック実装で'../src/data/server'を置き換える冗談を開始することであるので、fileToTestは、サーバをインポートし、それを呼び出すときに、それは実際にスパイ関数を呼び出します。次に、正しいパラメータで呼び出されたと期待することができます。

Btw。テストで何を試してみて、機能をチェックしているのかは、スパイを呼び出すときに渡す関数としては機能しません。toBeCalledWithに渡す関数は同じではありません。私はそれぞれの単一のパラメータ

expect(server.report.mock.calls[0][0]).toBe("1033083fe"); 
expect(server.report.mock.calls[0][0]).toEqual({"address": "test address", "affiliation": "testaaa", 
    "city": "testcity", "copyright": true, "country": "testcountry", "email": "[email protected]", "message": "testmessage", 
    "name": "testname", "phone": "1234567890", "zipcode": "12345"}); 
かどうかを確認するでしょう。この場合

関連する問題