如何从@ionic/core模拟isPlatform

w8ntj3qf  于 2023-01-18  发布在  Ionic
关注(0)|答案(2)|浏览(143)

有一个React Ionic应用程序,我需要确定该应用程序是否在iOS设备上运行。我已经通过导入isPlatform完成了这一操作。

import { isPlatform } from "@ionic/core";

const isIOS = isPlatform("ios");

我尝试了以下方法,当isPlatform被调用时,它仍然返回false。

jest.mock("@ionic/core", () => ({
            isPlatform: () => { 
                return true;
            }
        }));

如何在单元测试中使用jest模拟isPlatform,使其返回true?
想通了,我需要模拟离子/核心才能让它起作用。

jest.mock("@ionic/core");
import * as Ionic from '@ionic/core';

(Ionic as any).isPlatform = jest.fn(() => true);
33qvvth1

33qvvth11#

如果组件仅在@ionic/core中使用isFlatform,则可以模拟一个函数isFlatform:

jest.mock("@ionic/core", () => ({
  isPlatform: () => true,
}));

但是当组件使用另一个函数并且您只想模拟isFlatform时,您可以用途:

jest.mock("@ionic/core", () => ({
  ...jest.requireActual("@ionic/core"),
  isPlatform: () => true,
}));
0vvn1miw

0vvn1miw2#

与之前的响应类似,但使用了稍微更灵活的方法,以便能够根据我们希望在每个场景中测试的内容模拟结果。在我们的应用中,我们使用的是Angular,但这种方法应该也适用于React。
其思想是定义一个mockIsPlatform()函数:

// Note: on our app, we're importing the `isPlatform` helper method 
// from `@ionic/angular` but that's not really important.

let mockIsPlatform: (key: string) => boolean;

jest.mock('@ionic/angular', () => ({
  ...(jest.requireActual('@ionic/angular') as object),
  isPlatform: (key: string) => mockIsPlatform(key),
}));

我们的服务有一些方法在后台使用isPlatform()方法:

public isIos(): boolean {
    return isPlatform('ios');
  }

  public isAndroid(): boolean {
    return isPlatform('android');
  }

现在我们可以像这样测试这些方法:

test('detect platform', () => {
    // Simulate ios platform
    mockIsPlatform = (key) => key === 'ios';    
    expect(myServiceInstance.isIos()).toBeTruthy();
    expect(myServiceInstance.isAndroid()).toBeFalsy();

    // Simulate android platform
    mockIsPlatform = (key) => key === 'android';    
    expect(myServiceInstance.isIos()).toBeFalsy();
    expect(myServiceInstance.isAndroid()).toBeTruthy();

})

相关问题