微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

测试中的Renderer2,RendererFactory2失败-TypeError:无法读取未定义的属性'createElement'

如何解决测试中的Renderer2,RendererFactory2失败-TypeError:无法读取未定义的属性'createElement'

我在angular 9应用程序中有一个首选项服务,该应用程序使用Renderer2中的'createElement'创建了一个脚本标签。 当我尝试模拟Renderer2时,无法识别createElement。

这是我的服务。

 @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);
      })
    );
});

运行测试时出现此错误 TypeError:无法读取未定义的属性'createElement'

任何想法,

解决方法

我通过创建一个包含我需要的元素的const来解决了这个问题,然后监视RendererFactory2以返回我创建的const:

// 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();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。