在React Testing库中测试依赖于状态上下文提供者链的react组件

时间:2020-06-27 21:06:06

标签: reactjs testing react-testing-library react-context use-context

我知道this,但这不是我的情况。

示例:

<AuthProvider>
  <SessionProvider>
    <AnotherProvider>
      <OneMoreProvider>
        <MyComponent />

所有这些提供程序实际上都是具有状态和效果的常规React组件,它们通过GraphQL获取一些数据并将该数据作为“值”属性传递给return语句中的MyContext.Provider。

这迫使我为所有这些提供程序中使用的模块创建很多模拟,只是为了在测试环境中呈现我自己的组件。

是否有什么想法可以避免创建太多模拟?

1 个答案:

答案 0 :(得分:0)

您可以使用自定义渲染函数创建帮助程序测试库,该函数将您的组件与上下文包装在一起,然后从那里导出所有反应测试库方法

class FeedbackManager: UIViewController, MFMailComposeViewControllerDelegate { func sendEmail(feedback: Feedback, presentingViewController: UIViewController) -> UIViewController { if MFMailComposeViewController.canSendMail() { let mail = MFMailComposeViewController() mail.mailComposeDelegate = self mail.setToRecipients([feedback.recipients]) mail.setSubject("Feedback: \(feedback.subject)") mail.setMessageBody("<p>\(feedback.body)</p>", isHTML: true) present(mail, animated: true) return self } else { print("else:") return mailFailed(presentingViewController: presentingViewController) } } func mailFailed(presentingViewController: UIViewController) -> UIViewController { print("mailFailed():") let failedMenu = UIAlertController(title: "Please Email Me!", message: nil, preferredStyle: .alert) let okAlert = UIAlertAction(title: "Ok!", style: .default) failedMenu.addAction(okAlert) return failedMenu } func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { controller.dismiss(animated: true) self.dismiss(animated: false) } }

- test/lib.jsx

然后使用此辅助函数库导入测试功能,而不是直接使用import React from 'react'; import { render as reactRender } from '@testing-library/react'; export * from '@testing-library/react'; export const render = (MyComponent, options) => { return reactRender( <AuthProvider> <SessionProvider> <AnotherProvider> <OneMoreProvider> {MyComponent} </OneMoreProvider> </AnotherProvider> </SessionProvider> </AuthProvider>, options ) }

@testing-library/react