我运行jasmin-Karma测试以下功能
ExampleFunction(someParam) {
let element = document.querySelector(`aSelectorId}`);
if (element ) {
element.classList.remove('disabled');
element.classList.add('enabled');
}
}
这是我跑步的测试
describe('ExampleFunction', () => {
it('it should enable and disable', () => {
spyOn(document, "querySelector").and.callFake(function() {
return {
value: true
}
});
componentInstance.ExampleFunction("params");
expect(componentInstance.Somevalue).toBe(something);
});
});
现在的问题是代码覆盖率显示
element.classList.remove('disabled');
已覆盖但未覆盖此行!
element.classList.add('enabled');
请大家告诉我为什么会发生吗?
答案 0 :(得分:1)
您在间谍内部指定的返回值没有classList属性。这应该导致最后一行代码无法执行。
尝试在间谍中添加两个“删除并添加”方法:
return {
value: true
classList: {
remove: () => {},
add: () => {}
}
}
或者,您还可以提供用于remove和add的模拟,以便您也可以测试这些方法是否具有正确的属性。
这可能看起来像这样:
it('it should enable and disable', () => {
const removeSpy = jasmine.createSpy();
const addSpy = jasmine.createSpy();
spyOn(document, "querySelector").and.callFake(function() {
return {
value: true,
classList: {
add: addSpy,
remove: removeSpy
}
}
});
componentInstance.ExampleFunction("params");
expect(componentInstance.Somevalue).toBe(something);
expect(addSpy).toHaveBeenCalledWith('enabled');
expect(removeSpy).toHaveBeenCalledWith('disabled')
});
请注意,这是伪代码,我没有对其进行正确的测试,但是它应该可以正常工作。