如何修复功能已经在 J​​asmine 中发现错误

How to fix function has already been spied on error in Jasmine

我有 3 个测试,每个测试不同的方法。

it('test function1', function() {
   spyOn(document, 'getElementById');
   // ... some code to test function1
   expect(document.getElementById).toHaveBeenCalled();

 });

it('test function2', function() {
   spyOn(document, 'getElementById');
   // ... some code to test function2
   expect(document.getElementById).toHaveBeenCalled();

 });

it('test function3', function() {
   spyOn(document, 'getElementById');
   // ... some code to test function3
   expect(document.getElementById).toHaveBeenCalled();    
 });

但是当我 运行 这些测试时,我得到以下错误:getElementById has already been spied upon。有人可以解释为什么即使间谍在不同的测试套件中我也会收到此错误以及如何修复它。

一旦你窥探了一个方法,你就不能再窥探它了。如果你只想检查它是否在每个测试中被调用,只需在测试开始时创建间谍,并在 afterEach:

中重置调用
     spyOn(document, 'getElementById');

     afterEach(() => {
       document.getElementById.calls.reset();
     });

     it('test function1', function() {
       // ... some code to test function1
       expect(document.getElementById).toHaveBeenCalled();

     });

    it('test function2', function() {
       // ... some code to test function2
       expect(document.getElementById).toHaveBeenCalled();

     });

    it('test function3', function() {
       // ... some code to test function3
       expect(document.getElementById).toHaveBeenCalled();    
     });

回复晚了,但是,如果有人试图多次窥探相同的功能但具有不同的 return 值,您可以使用

it('test function', function() {
   // spy and return data
   spyOn(serviceName,'functionName').and.returnValue(data);
   expect(serviceName.functionName).toHaveBeenCalled();
   
   // spy and return newData
   serviceName.functionName = jasmine.createSpy().and.returnValue(newData);
   expect(serviceName.functionName).toHaveBeenCalled();
});