React Native: 在Jest单元测试中模拟离线设备

6
我正在编写一个React Native应用程序,并使用Jest对我的代码进行单元测试。
我编写了一个函数来检查是否有网络连接。现在,我想编写它的单元测试,但遇到了困难,因为我不知道如何在单元测试中模拟设备的连接状态。
你可以如何在单元测试中模拟设备离线或在线? 编辑: 这是该函数:
import { NetInfo } from "react-native";
import { NO_NETWORK_CONNECTION } from "../../../../config/constants/errors";

const checkNetwork = (): Promise<boolean | string> =>
  new Promise((resolve, reject) => {
    NetInfo.isConnected
      .fetch()
      .then(isConnected => (isConnected ? resolve(true) : reject(NO_NETWORK_CONNECTION)))
      .catch(() => reject(NO_NETWORK_CONNECTION));
  });

export default checkNetwork;

我希望在我的测试中对其进行测试,以查看如果设备已连接,则它是否正确解析为true,并拒绝字符串,如果请求失败。为此,我需要在单元测试中模拟设备的连接。

1个回答

5
这很简单,只需像这样模拟NetInfo即可:
import {
    NetInfo
} from "react-native";
import checkNetwork from "...";
import {
    NO_NETWORK_CONNECTION
} from "...";

jest.mock('react-native', () => ({
    NetInfo: {
        isConnected: {
            fetch: jest.fn()
        }
    }
}))

test('test offline', async () => {
    NetInfo.isConnected.fetch.mockResolvedValueOnce(false)
    expect(await checkNetwork()).toBe(NO_NETWORK_CONNECTION)
})

test('test online', async () => {
    NetInfo.isConnected.fetch.mockResolvedValueOnce(true)
    expect(await checkNetwork()).toBe(true)
})

非常好用,非常感谢!唯一的问题是,由于我正在使用TypeScript,我收到了警告:[ts] Property 'mockResolvedValueOnce' does not exist on type '() => Promise<boolean>'。你有任何想法如何解决这个问题吗? - J. Hesters
另外还有一个跟进的问题:在我使用它的其他测试中,我该如何模拟这个函数?如果你能回答这些问题,我会非常感激! - J. Hesters
我尝试过了,但问题是测试仍然使用非模拟函数。您能否举个例子说明您如何做到这一点?我只能通过像您的示例中一样模拟NetInfo来使使用checkNetwork的其他测试正常工作。我很想让__mocks__起作用。 - J. Hesters
我不确定如何在注释中加入这个。我建议你为此创建另一个堆栈溢出的问题。 - Herman Starikov
1
我会的,谢谢你的帮助,你帮了我很多!我只需要再等80分钟,因为我刚刚在这里提出了另一个关于TypeScript测试的问题。 - J. Hesters
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接