Ошибка Renderer2, RendererFactory2 в тестах — ошибка типа: не удается прочитать свойство ‘createElement’ неопределенного

#angular #jasmine #karma-jasmine #angular-renderer2

#angular #jasmine #карма-жасмин #angular-renderer2

Вопрос:

У меня есть служба настроек в приложении angular 9, которая создает тег сценария, в котором используется ‘createElement’ из Renderer2. Когда я пытаюсь издеваться над Renderer2, createElement не распознается.

Это мой service.ts :

  @Injectable()
 export class MyServer {

   private renderer: Renderer2;
   constructor(
     //....
     rendererFactory: RendererFactory2) {
     this.renderer = rendererFactory.createRenderer(null, null);
   }

   public createScript() {
    if (isLoginPage) {
      const script = this.renderer.createElement('script');
      script.type = 'text/javascript';
      script.src = 'urlScript';
      this.renderer.appendChild(document.body, script);
    }
  }
}
  

Это мой service.spec.ts :
describe(‘MyServer’, () => {

   describe('creerScriptTag', () => {

    beforeEach(() => TestBed.configureTestingModule({
      declarations: [],
      imports: [],
      providers: [
        MyServer,
        ConfigurationService,
        { provide: ModelService, useClass: ModelMockService },
        Renderer2
      ]
    }
    ));

    it('isLogin True verify that the script was created',
     inject([ConfigurationService, MyServer],
      (configurationService: ConfigurationService,
       myServer: MyServer,
       renderer2: Renderer2) => {
        spyOn(configurationService, 'getConfig').and.returnValue('anyString');
        myServer.createScript();

        expect(renderer2.createElement).toHaveBeenCalledTimes(1);
      })
    );
});
  

Когда я запускаю тест, я получил эту ошибку Ошибка типа: не удается прочитать свойство ‘createElement’ неопределенного

Любая идея, пожалуйста,

Ответ №1:

Я решил это, создав const, содержащий элемент, который мне нужен, и я отслеживаю RendererFactory2, чтобы вернуть созданную мной константу :

 // create the const
const render2 = {createElement: jasmine.createSpy('createElement'), appendChild: 
jasmine.createSpy('appendChild')};

//mock of RendererFactory2 return the const
beforeEach(() => {
  spyOn(TestBed.get(RendererFactory2), 'createRenderer').and.returnValue(render2);
}
);

// I use the render2 const as it's my Renderer2
expect(render2.appendChild).toHaveBeenCalled();