文档元素的模拟对象

Ted*_*Ted 32 javascript unit-testing jasmine

我有下一个测试代码:

it("Test", function() {
    loadResources();

    expect(document.getElementById('MyElement').innerHTML).toBe("my string");
});
Run Code Online (Sandbox Code Playgroud)

函数体loadResources():

document.getElementById('MyElement').innerHTML = "my string";
Run Code Online (Sandbox Code Playgroud)

我的测试失败并显示以下消息:

TypeError:无法设置null的属性"innerHTML".

看起来我需要为innerHTML创建模拟对象.我怎么能这样做?

dev*_*l69 64

我认为你应该模拟getElementById返回虚拟HTMLElement

var dummyElement = document.createElement('div');
document.getElementById = jasmine.createSpy('HTML Element').andReturn(dummyElement);
Run Code Online (Sandbox Code Playgroud)

所以现在,每次调用document.getElementById它都会返回虚拟元素.它将设置虚拟元素的innerHTML,并将其与最终的预期结果进行比较.

编辑:我想你应该更换toBe使用toEqual.toBe可能会失败,因为它将测试对象标识而不是值相等.

EDIT2(关于多个身份证):我不确定,但你可以打电话给假.它将为每个ID创建一个新的HTML元素(如果它还不存在)并将其存储在对象文字中以供将来使用(即getElementById使用相同ID的其他调用)

var dummyElement = document.createElement('div');
document.getElementById = jasmine.createSpy('HTML Element').and.returnValue(dummyElement);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此答案使用了jasmine 1.3语法.茉莉花2.0(和之后)是不同的.例如:jasmine.createSpy('HTML Element').and.returnValue(dummyElement); (9认同)
  • 如果我有2个id怎么办?document.getElementById('MyElement1').innerHTML ="my string"; document.getElementById('MyElement2').innerHTML ="my string"; 我需要检查这些id? (3认同)
  • 如果我这样做的话它可以重置吗?因为它可能会以某种方式干扰其他规范文件,因为文档是一个全局对象 (3认同)

p8u*_*8ul 7

通过 id 设置文档正文和 getElement。我正在使用开玩笑,这很好用。从 jest 文档中查看此示例

test('Toggle innerHtml of an element', () =>{
document.body.innerHTML =
            '<div>' +
            '  <div id="username" >Hello</div>' +
            '  <button id="button" />' +
            '</div>';
var el = document.getElementById('username');
var newText = 'new inner text';
el.innerText = newText;
expect(el.innerText).toEqual(newText);
});
Run Code Online (Sandbox Code Playgroud)


小智 6

尝试这个:

it('should blah', () => {
  const elementMock = {
    innerHTML: 'my string'
  };    

  loadResources();

  jasmine.spyOn(document, 'getElementById').and.returnValue(elementMock);

  expect(document.getElementById('MyElement').innerHTML).toBe('my string');
});
Run Code Online (Sandbox Code Playgroud)