当前位置: 首页 > 知识库问答 >
问题:

如何在Cypress中存根模块

越文康
2023-03-14

我正在尝试使用Cypress存根一个模块。这是我到目前为止尝试过的,但不起作用。

这是我的组件/页面的简短版本

// SomeComponent.jsx

import { useSomething } from './useSomething'

const SomeComponent = () => {
  // useSomething is a custom hook
  const { data, error } = useSomething()

  const renderData = () => {
    // map the data into an array of JSX elements
    return data.map(...)
  }

  return (
    <div>
      {renderData()}
    </div>
  )
}

export default SomeComponent

这是我定制的钩子的样子

// useSomething.js

import { useState } from 'react'
import { getData } from './db'

export const useSomething = () => {
  const [data, setData] = useState({})
  const [error, setError] = useState()

  useEffect(() => {
    getData().then(data => {
      setData(data)
    }).catch(err => {
      setError(error)
    })

    // ... some other unrelated code here
  }, [])

  return { data, error }
}

下面是getData的外观

// getData.js

export const getData = () => {
  const data = // some API call from external services

  return data
}

方法通过db.js(实际上是db/index.js)公开

// db.js

export * from './getData'

我正在尝试存根getData。js使e2e测试更加一致。这就是我所做的。

// something.spec.js

// I'm writing @src just to keep the code sample here short, it's the same file as the db.js I write above
import * as db from '@src/db'

...

// this is how I try to do the stubbing
cy.stub(db, 'getData').resolves(something)

...

上面的存根不起作用。运行测试时,对外部服务的API调用仍在进行。文档本身让我推断我应该这样写,但它不起作用。

共有1个答案

钮巴英
2023-03-14

可以在窗口上公开db

// useSomething.js

import { useState } from 'react'
import * as db from './db'

const { getData } = db;

if (window.Cypress) {     // only when testing
  window.db = db;
}

在测试中

cy.window().then(win => {
  cy.stub(win.db, 'getData').resolves(something);
})

或使用拦截存根API调用。

 类似资料:
  • 我创建了express应用程序,有一条路线可以使用许多中间件: 这是我的中间件。js: 它工作得很好。但当我试着写测试时遇到了问题。这是我的测试,我使用mocha、chai、supertest和sinon: 问题是什么 您可以看到有3个存根,1个用于,2个用于在路由的同一个文件中。 问题是,2个存根工作,而1个用于<代码>中间件。saveUser不工作,请始终触发原始用户。 我想,当我调用setu

  • 我需要为使用CXF组件调用SOAP web服务的Camel路由编写一些单元测试。 跳过SOAP请求并返回stubbed响应的最干净的方法是什么? 我尝试使用模拟endpoint,但是请求要么被传递到真正的endpoint,要么在处理器回调时被忽略。 我用Blueprint配置Camel,并用camel-test-blueprint 2.17.1运行它。这就是我的Blueprint.xml配置的样子

  • 我正在用cypress做E2E测试。我必须计算表中的行数,每种情况都不同。 在正常的javascript中,我写这个只是为了得到列的总行数 不幸的是,在柏树我得到以下错误: 我试着这样数数但一无所获 我不知道它从哪里返回了行数

  • 问题内容: 该赛普拉斯文档说可以 公开数据存储区(例如Redux中的数据存储区),以便您可以通过编程方式直接从测试代码中更改应用程序的状态。 我还观看了Kent C. Dodds先生的测试课程,他提到可以使用Cypress中的现有数据来初始化redux存储(在测试之前或之中,不确定) 我浏览了几乎所有的文档并进行了谷歌搜索,除了在介绍页面上将其作为关键区别之一外,我只是找不到任何实际执行此操作的参

  • 问题内容: 我需要测试一个函数,该函数需要使用urllib.urlopen(它也使用urllib.urlencode)来查询外部服务器上的页面。服务器可能已关闭,页面可能已更改;我不能依靠它进行测试。 控制urllib.urlopen返回的最佳方法是什么? 问题答案: 另一个简单的方法是让您的测试覆盖urllib的功能。例如,如果您的模块具有 您可以这样定义测试: 然后,当您的测试调用中的函数时,

  • 问题内容: 我曾经使用过JUnit和Mocks,但我想知道,JUnit中的Mocks和Stub之间有什么区别,以及如何在JUnit,Java中使用Stub?作为具有EasyMock,Mockito等的Mocks,Stubs在Java中使用什么? 请提供Java中的存根示例代码。 问题答案: 要在junit中使用存根,您不需要任何框架。 如果您想存根某些接口,只需实现它: 然后创建一个新的存根对象并