How to test Async Storage with Jest?

前端 未结 6 826
悲哀的现实
悲哀的现实 2020-12-05 18:02

I\'m building an app with React Native. I want to minimize how often I communicate to the database, so I make heavy use of AsyncStorage. There\'s a lot of room for bugs in t

6条回答
  •  执笔经年
    2020-12-05 18:34

    My original answer just pointed at how the author of react-native-simple-store had dealt with the mocking. I've updated my answer with my own mocking that removes Jason's hard-coded mock responses.

    Jason Merino has a nice simple approach to this in https://github.com/jasonmerino/react-native-simple-store/blob/master/tests/index-test.js#L31-L64

    jest.mock('react-native', () => ({
    AsyncStorage: {
        setItem: jest.fn(() => {
            return new Promise((resolve, reject) => {
                resolve(null);
            });
        }),
        multiSet:  jest.fn(() => {
            return new Promise((resolve, reject) => {
                resolve(null);
            });
        }),
        getItem: jest.fn(() => {
            return new Promise((resolve, reject) => {
                resolve(JSON.stringify(getTestData()));
            });
        }),
        multiGet: jest.fn(() => {
            return new Promise((resolve, reject) => {
                resolve(multiGetTestData());
            });
        }),
        removeItem: jest.fn(() => {
            return new Promise((resolve, reject) => {
                resolve(null);
            });
        }),
        getAllKeys: jest.fn(() => {
            return new Promise((resolve) => {
                resolve(['one', 'two', 'three']);
            });
        })
      }
    }));
    

    My own mock:

    const items = {};
    
    jest.mock('react-native', () => ({
    
    AsyncStorage: {        
    
        setItem: jest.fn((item, value) => {
            return new Promise((resolve, reject) => {        
        items[item] = value;
                resolve(value);
            });
        }),
        multiSet:  jest.fn((item, value) => {
            return new Promise((resolve, reject) => {
        items[item] = value;
                resolve(value);
            });
        }),
        getItem: jest.fn((item, value) => {
            return new Promise((resolve, reject) => {
                resolve(items[item]);
            });
        }),
        multiGet: jest.fn((item) => {
            return new Promise((resolve, reject) => {
                resolve(items[item]);
            });
        }),
        removeItem: jest.fn((item) => {
            return new Promise((resolve, reject) => {
                resolve(delete items[item]);
            });
        }),
        getAllKeys: jest.fn((items) => {
            return new Promise((resolve) => {
                resolve(items.keys());
            });
        })
      }
    }));
    

提交回复
热议问题