我知道this,但这不是我的情况。
示例:
<AuthProvider>
<SessionProvider>
<AnotherProvider>
<OneMoreProvider>
<MyComponent />
所有这些提供程序实际上都是具有状态和效果的常规React组件,它们通过GraphQL获取一些数据并将该数据作为“值”属性传递给return语句中的MyContext.Provider。
这迫使我为所有这些提供程序中使用的模块创建很多模拟,只是为了在测试环境中呈现我自己的组件。
是否有什么想法可以避免创建太多模拟?
答案 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