小编典典

如何使用Jest测试异步存储?

reactjs

我正在用React
Native构建一个应用程序。我想尽量减少与数据库通信的频率,因此我大量使用了AsyncStorage。虽然在DB和AsyncStorage之间的转换中存在很多错误的余地。因此,我想通过对它运行自动化测试来确保AsyncStorage拥有我相信的数据。令人惊讶的是,我还没有找到有关如何在线进行操作的任何信息。我自己尝试做的尝试还没有完成。

使用笑话:

it("can read asyncstorage", () => {
return AsyncStorage.getItem('foo').then(foo => {
  expect(foo).not.toBe("");
});  });

此方法失败,并出现错误:

TypeError: RCTAsyncStorage.multiGet is not a function

删除退货将导致其立即运行,而无需等待该值并且不正确地通过了测试。

当我尝试使用await关键字进行测试时,我遇到了完全相同的错误:

it('can read asyncstorage', async () => {
this.foo = "";
await AsyncStorage.getItem('foo').then(foo => {
    this.foo = foo;
});
expect(foo).not.toBe(""); });

关于如何针对AsyncStorage中的值成功运行断言的任何建议?我希望继续使用Jest,但是如果只能通过一些替代测试库来完成,那么我可以接受。


阅读 288

收藏
2020-07-22

共1个答案

小编典典

我最初的回答只是指出react-native-simple-store的作者如何处理模拟。我用自己的模拟更新了答案,该模拟除去了Jason的硬编码模拟响应。

Jason
Merino
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']);
        });
    })
  }
}));

我自己的模拟:

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());
        });
    })
  }
}));
2020-07-22