javascript - 用 Jest 模拟条件 window.open 函数调用

标签 javascript typescript testing mocking jestjs

我正在尝试编写一个测试,以确保在我将有效的 URL arg 传递给它运行 windows.open(args) 的函数时打开它。然后确保我专注于它。

测试链接有效性:

export function isValidURL(url: string): boolean {
  try {
    new URL(url)
    return true
  } catch (e) {
    console.warn(`Invalid URL: ${url}`)
    return false
  }
}

打开链接:

export function openURL(url: string): void {
  if (isValidURL(url)) {
    const exTab = window.open(url, "_blank")
    if (exTab) exTab.focus()
  }
}

我想我应该模拟一些函数或者伪造它的代码,然后等待它的调用次数或类似的东西。但我是开 Jest 和测试的新手,我对如何做到这一点感到很困惑。

我的论文:

describe("Test tools.openURL()", () => {
  test("it should open link if valid.", () => {
    const { open } = window
    delete window.open
    window.open = jest.fn()
    openURL("htts//url2.de9v")
    expect(window.open).not.toHaveBeenCalled()
    openURL("https://www.url1.dev")
    expect(window.open).toHaveBeenCalled()
    window.open = open
    // test focus here
  })
})

通过这段代码,我已经成功地测试了open,现在我只需要测试focus

最佳答案

'open'是只读属性。 而不是 jest.spyOn(window, "open")尝试:

Object.defineProperty(window, 'open', { value: <your mock> });

代替<your mock>找到应返回的模拟对象或对象。

关于javascript - 用 Jest 模拟条件 window.open 函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58189851/

相关文章:

javascript - web2py:如何将 javascript 添加到 Web2py Crud 表单?

javascript - 如何将样式从 react semantic-ui Card 组件传递到 img 标签

javascript - ckeditor 自定义模板配置

typescript - 在 Redux 中输入通用操作

linq-to-sql - 我如何模拟或测试我的延迟评估/执行功能?

javascript - (Fullcalendar 4 VueJs)columnHeaderHtml - 如何显示(dayName,dayNumber),例如(周一,8),(周二,9)等

javascript - Typescript 编译器为 Reselect.createSelector() 生成错误的返回类型

testing - 处理分支测试

java - 使用测试用例数组调用 java 方法

typescript - 日期变量有效,但其上的函数无效