我正在尝试为我的测试操纵documentElement lang属性。
而且无法弄清楚我该怎么做到。我已经尝试过在Jest配置中定义setupFiles,这给了我定义它的可能性,并且没有为其他测试更改它的选项-如此处所述:Mocking `document` in jest

测试代码的一部分如下所示:

const lang: string = document.documentElement.lang ?
      document.documentElement.lang : Constraints.DEFAULT_LANGUAGE;

测试如下所示:
   test('should pass `en` language when document hasn`t any specified', () => {
    const spy = jest.spyOn(window.document, 'documentElement', 'get');
    expect(spy).toHaveBeenCalled();
  });

并使用 setupFiles :
Object.defineProperty(document, 'documentElement', {
    writable: true,
    configurable: true,
    value: document.createElement('document')
});

当我有setupFiles时,出现错误:Property documentElement does not have access type get
但是,当我尝试在未配置setupfile.js的情况下对其进行监视时,永远不会调用 spy 。

编辑

我想要达到的更清晰的示例:
    const lang: string = document.documentElement.lang ?
      document.documentElement.lang : Constraints.DEFAULT_LANGUAGE;
    component.src = `/${lang}/mysite`;
test('should pass `de` language when document has one specified', () => {
    const spy = jest.spyOn(window.document, 'documentElement', 'get');
    const mockElement = document.createElement('document');
    mockElement.lang = 'de';
    spy.mockReturnValue(mockElement);
    expect(component.src).toContain('/de/');
  });

在测试中,我得到:
expect(received).toContain(expected) // indexOf

    Expected substring: "/de/"
    Received string:    "http://localhost/en/mysite"

最佳答案

好了,您几乎到了那里,但是当您访问document.documentElement.lang属性时,已触发get访问器。因此,您应该按如下方式定义该对象;

Object.defineProperty(document, 'documentElement', {
    configurable: true,
    get () {
        return document.createElement('document');
    },
});

在测试中

在期望行之前,您应该添加此行以触发getter并使 spy 被调用。
window.document.documentElement.lang;

编辑

忘掉上面。

只需删除安装代码块,我就不需要 spy 或其他东西。

创建一种将语言设置为常量的方法。然后测试该方法,而不是测试documentElement的get操作。

在调用方法之前,请使用下面的代码来设置lang属性。 (想象一下您有语言方法)
test('should return `de` language when document has one specified', () => {
    Object.defineProperty(document.documentElement, 'lang', { value: 'de', configurable: true });

    expect(component.language()).toBe('de');
});

10-07 16:16