REACT+玩笑测试状态的使用效应变化

发布于 2025-01-26 13:49:00 字数 2156 浏览 2 评论 0原文

因此,我在 stackover flow答案,但是有些不同。我有一个反应组件,它具有两个使用效果钩。首次使用一种使用效果钩,而另一种使用该使用效果挂钩更改中的依赖性。我尝试嘲笑GetDelivery,但它来自应用程序中定义的自定义挂钩。

// app.tsx

const App = () => {
  const [deliveryType, setDeliveryType] = useState([])
  const { DeliveryStatusService } = useServices()
  const deliveryStatusService = new DeliveryStatusService()
  const { deliveryId } = useParams()

  useEffect(() => {
    setup()
  }, [])

  useEffect(() => {
    if (deliveryType) {
      console.log("DeliveryType is Set")
    }
  }, [deliveryType])

  const setup = async () => {
    const response = await deliveryStatusService.getDelivery(deliveryId) // this call comes from custom hook and external service
    setDeliveryType(response)
  }

  return (
    <>
      <div>{!deliveryType ? <div>Render Loading</div> : <div>Data loaded with {deliveryType}</div>}</div>
    </>
  )
}

我试图按照上述文章中的规定进行嘲笑,如下所述,请使用开玩笑和酶,但是如果我console.log(wrapper.debug),我仍然会得到dender> Render lade loading而不是加载{deliveryType}的数据。

我尝试这样嘲笑它:

const getDelivery = jest.fn()
const DeliveryStatusService = jest.fn().mockImplementation(() => ({
  getDelivery,
}))

it('mock getDelivery', () => {
  const wrapper = mount(<ServiceProvider services={{DeliveryStatus}}>
                         <App />
                        </ServiceProvider>
  getDelivery.mockReturnValue(
  Promise.resolve(
    ... dummyData
  ),
)
await act(flushPromises)

wrapper.update()

await act(flushPromises)
console.log(wrapper.debug())

console.log(wrapper.debug())产生以下输出:

<ServiceProvider services={{...}}>
        <App>
          <div>
            <div>
              Render Loading
            </div>
          </div>
        <App>
 </ServiceProvider>

我不是正确模拟了,这样我就永远不会加载data已加载 div div div ?

So I've a similar useCase defined in stackover flow answer, but somewhat different. I have a react component and it has two useEffect hooks. One useEffect hook is used at first time render and other once the dependency in that useEffect hook changes. I tried mocking getDelivery but it comes from a custom hook defined in app.

// App.tsx

const App = () => {
  const [deliveryType, setDeliveryType] = useState([])
  const { DeliveryStatusService } = useServices()
  const deliveryStatusService = new DeliveryStatusService()
  const { deliveryId } = useParams()

  useEffect(() => {
    setup()
  }, [])

  useEffect(() => {
    if (deliveryType) {
      console.log("DeliveryType is Set")
    }
  }, [deliveryType])

  const setup = async () => {
    const response = await deliveryStatusService.getDelivery(deliveryId) // this call comes from custom hook and external service
    setDeliveryType(response)
  }

  return (
    <>
      <div>{!deliveryType ? <div>Render Loading</div> : <div>Data loaded with {deliveryType}</div>}</div>
    </>
  )
}

I tried to mock it out as stated in above article as follows using Jest and Enzyme but if I console.log(wrapper.debug) I still get Render Loading and not Data loaded with {deliveryType}.

I tried mocking it like this :

const getDelivery = jest.fn()
const DeliveryStatusService = jest.fn().mockImplementation(() => ({
  getDelivery,
}))

it('mock getDelivery', () => {
  const wrapper = mount(<ServiceProvider services={{DeliveryStatus}}>
                         <App />
                        </ServiceProvider>
  getDelivery.mockReturnValue(
  Promise.resolve(
    ... dummyData
  ),
)
await act(flushPromises)

wrapper.update()

await act(flushPromises)
console.log(wrapper.debug())

console.log(wrapper.debug()) yields the following output:

<ServiceProvider services={{...}}>
        <App>
          <div>
            <div>
              Render Loading
            </div>
          </div>
        <App>
 </ServiceProvider>

Am I not mocking correctly so that I would never have Data loaded div?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文