2017-05-04 8 views
1

jestでカスタム関数をモックしようとしていますが、問題があります。jestでコールバック関数をモックする方法

これは私の関数である:

export const resizeImage = (file, fileName, callback) => { 
    const MAX_WIDTH = avatarImage.maxWidth; 
    const MAX_HEIGHT = avatarImage.maxHeight; 
    const img = document.createElement('img'); 
    img.src = window.URL.createObjectURL(file); 
    const canvas = document.createElement('canvas'); 
    const ctx = canvas.getContext('2d'); 

    img.onload =() => { 
    const sizes = internalResizeImage(img, MAX_WIDTH, MAX_HEIGHT); 

    canvas.width = sizes.width; 
    canvas.height = sizes.height; 
    ctx.drawImage(img, 0, 0, sizes.width, sizes.height); 
    return callback(dataURItoFile(canvas.toDataURL(), fileName)); 
    }; 
}; 

私はこのように呼ばれる:私はmockResizeImageがしたい

let mockResizeImage = jest.fn(); 

jest.mock('../../utilities/imageUtils',() => ({ 
    resizeImage:() => mockResizeImage 
})); 

:私はこのようにそれをからかってる私のテストで

resizeImage(acceptedFiles[0], this.props.user.id, (res) => { 
    //dostuff 
}); 

コールバックになり、私のテストで戻り値を変更します:

it('should call handleDrop and accept files',() => { 
    //mockResizeImage.mockReturnValue('something'); 

    const instance = shallow(mockComponent()).instance(); 
    const acceptFilesMock = ['test']; 

    instance.handleDrop(acceptFilesMock); 

    expect(clickSpy).toHaveBeenCalledTimes(1); 
    }); 

もしそれが約束だったのなら、それはすべていいですが、それはコールバックであり、私が間違っていることは分かりません。

ありがとうございました。

答えて

1

は、あなたのオリジナルのものと同じパラメータをexceptsで機能を持つモジュールを模擬し、即座にコールバックを呼び出すことができます。ところで

jest.mock('../../utilities/imageUtils',() => ({ 
    resizeImage: (file, fileName, callback) => callback('someData') 
})); 

を。あなたの質問でモジュールを模倣する方法は、方法の原因で動作することはできませんjest.mockが動作します。 letステートメントの後で書いても、テストがコンパイルされたときにファイルの先頭に移動します。だから、スパイと機能を模擬するための最良の方法は、次のようになります。

import {resizeImage} from '../../utilities/imageUtils' 

jest.mock('../../utilities/imageUtils',() => ({ 
    resizeImage: jest.fn((file, fileName, callback) => callback('someData')) 
})); 

を今、あなたは上記と同じ動作を持っていますが、resizeImageが正しいパラメータで呼び出されたこともテストすることができます。

expect.anything()使用 toBeCalledWithを使用した場合

expect(resizeImage.mock.calls[0][0]).toBe('firstParameter') 
expect(resizeImage.mock.calls[0][1]).toBe('secondParameter') 

それとも最後のパラメータにワイルドカードを使用する:あなたの最後のパラメータとして

は、あなたがいずれかのこのような2つの最初のparamsのためだけのテストはmock.callsを使用することができます機能です

expect(resizeImage).toBeCalledWith('firstParameter', 'secondParameter', expect.anything()); 
+0

ありがとう、アンドレアス!それは動作しますが、resizeImageのインポートをテストする方法はわかりません。私はそれにスパイダーを追加する必要がありますか?ありがとう –

+0

"test' resizeImage '"はどういう意味ですか? 'resizeImage'が正しいパラメータで呼び出されたことをテストしていますか? –

+0

はい、私はこれをやっています: '' 'expect(resizeImage).toHaveBeenCalledTimes(1);' '' –

関連する問題