我正在用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,但是如果只能通过一些替代测试库来完成,那么我可以接受。
我最初的回答只是指出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()); }); }) } }));