如何在摩卡单元测试中模拟document.evaluate()和XPathResult?

时间:2020-02-14 21:26:25

标签: javascript dom xpath mocha jsdom

我有以下JavaScript类包装document.evaluate(),使用XPath选择DOM元素:

'use strict'
Object.defineProperty(exports, '__esModule', { value: true })
class ElementByXPath {
  constructor(elementXPath) {
    this.elementXPath = elementXPath
  }
  element(document) {
    return document.evaluate(
      this.elementXPath,
      document.documentElement,
      null,
      XPathResult.FIRST_ORDERED_NODE_TYPE,
      null,
    ).singleNodeValue
  }
}
exports.ElementByXPath = ElementByXPath

mocha编写的以下测试应验证方法element()

describe('ElementByXPath function test', () => {
  it('should return element of given XPath', () => {
    const dom = new JSDOM(`<p id = "test-id"/p>`)
    const result = new ElementByXpath('//*[@id="test-id"]').element(
      dom.window.document,
    )

    expect(result.tagName).to.equal('P')
  })
})

使用JSDOM,我可以模拟window元素。不幸的是,我无法嘲笑XPathResult

ReferenceError: XPathResult is not defined

有人暗示吗?谢谢。

1 个答案:

答案 0 :(得分:1)

jsdom-global旁边添加jsdom(描述为here):

npm i -D jsdom jsdom-global

jsdom-global执行测试时注册mocha

mocha -r jsdom-global/register test/**/*.test.js