用玩笑

时间:2019-10-01 17:42:55

标签: 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()
  }
}

我认为我应该模拟一些函数或者伪造它的代码,然后等待它的调用次数或类似的次数。但是我对玩笑和测试不熟悉,我对如何做到这一点感到困惑。

我的评论

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

1 个答案:

答案 0 :(得分:1)

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

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

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