2017-05-04 56 views
1

我試圖用笑話來模擬自定義函數,但是我遇到了問題。如何用笑話模擬回調函數

這是我的函數:

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)); 
    }; 
}; 

我叫這樣的:

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

在我的測試,我嘲笑這樣的:

let mockResizeImage = jest.fn(); 

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

我想mockResizeImage到作爲回調,然後在我的測試中更改返回值:

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

你可以嘲笑與節選相同的參數爲原來的一個功能模塊,並立即調用回調:

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被稱爲用正確的參數。

由於您的最後一個參數是你可以使用mock.calls爲2個第一PARAMS像這只是測試的函數:

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

或使用最後一個參數一個通配符使用toBeCalledWith使用expect.anything()時:

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

非常感謝Andreas!它的工作原理,但我不知道如何測試resizeImage導入。我必須添加蜘蛛嗎?謝謝 –

+0

你是什麼意思「測試'resizeImage'」?測試'resizeImage'是否被調用了正確的參數? –

+0

是的,我現在這樣做了:'''expect(resizeImage).toHaveBeenCalledTimes(1);''' –