1

航海家

export type RootStackNavigator = {
   Welcome: undefined
   List: undefined
}

const Stack = createStackNavigator<RootStackNavigator>()
const { Navigator, Screen } = Stack

const Navigation = () => {
   return (
      <NavigationContainer>
         <Navigator initialRouteName={'Welcome'} headerMode="none">
            <Screen name="Welcome" component={Welcome} />
            <Screen name="List" component={List} />
         </Navigator>
      </NavigationContainer>
   )
}

欢迎画面

interface WelcomeProps {
   navigation: StackNavigationProp<RootStackNavigator, 'Welcome'>
}

const Welcome = ({ navigation }: WelcomeProps) => {
   return (
      <Screen style={styles.screen}>
         <TouchableWithoutFeedback onPress={() => navigation.navigate('List')} testID="touchable" style={styles.touchable}>
            etc ...
         </TouchableWithoutFeedback>
      </Screen>
   )
}

测试

describe('Welcome Screen', () => {
   it('Navigates to List Screen when clicked', () => {
      const navigate = jest.fn()
      const { getByTestId } = render(<Welcome navigation={{ navigate }} />)
      fireEvent.press(getByTestId('touchable'))
      expect(navigate).toBeCalledWith('List')
   })
})

有了这一切,我从打字稿中得到了这个错误:

Type '{ navigate: jest.Mock<any, any>; }' is not assignable to type 'StackNavigationProp<RootStackNavigator, "Welcome">'.

我该如何解决这个问题?

我正在尝试测试是否在应用程序呈现列表屏幕组件的屏幕中单击。

谢谢你。

PS:顺便说一句,测试通过

4

1 回答 1

0

我有同样的问题。我找到了一种方法,但我不确定这是最好的还是正确的方法。

我所做的只是从导航道具中添加使用过的功能。我使用Pick如下所示:

type PrivateScreenProps = {
  navigation: Pick<
    StackNavigationProp<MainStackRoutesType, Navigation.MainRoutes.PRIVATE>,
    'navigate'
  >;
};

export const PrivateScreen = ({ navigation }: PrivateScreenProps) => {
}

这只会在导航中添加导航功能。因此,在测试中,我只需要在导航模拟中定义导航功能。

const navigation = {
  navigate: jest.fn(),
};

render(<PrivateScreen navigation={navigation} />);

如果我需要使用另一个函数,例如goBack,我将它添加到类型中:

type PrivateScreenProps = {
  navigation: Pick<
    StackNavigationProp<MainStackRoutesType, Navigation.MainRoutes.PRIVATE>,
    'navigate' | 'goBack'
  >;
};

// in tests
const navigation = {
  navigate: jest.fn(),
  goBack: jest.fn(),
};
于 2021-06-30T03:00:01.307 回答