首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在构造函数中使用渲染器测试组件

如何在构造函数中使用渲染器测试组件
EN

Stack Overflow用户
提问于 2016-10-23 03:39:28
回答 1查看 5K关注 0票数 8

考虑下面的代码:

代码语言:javascript
复制
import {
    Component,
    OnInit,
    Renderer,
    OnDestroy
  } from '@angular/core';

  import { TranslateService } from 'ng2-translate/ng2-translate';

  export class AppComponent implements OnInit, OnDestroy {

  constructor( private translate: TranslateService, renderer: Renderer ) {
    this.globalKeyListenFunc = renderer.listenGlobal('document', 'keydown', (event) => {
      if (event.keyCode === 18) { // ALT-Key
        event.preventDefault();
      }
    });
    ...
  }

我如何使用jasmine测试来测试这样的组件?

我尝试了以下测试:

代码语言:javascript
复制
describe('App', () => {
  let injector: Injector;
  let backend: MockBackend;
  let connection: MockConnection;
  let translate: TranslateService;
  let renderer: Renderer;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpModule, TranslateModule.forRoot()],
      providers: [
        AppComponent,
        {provide: XHRBackend, useClass: MockBackend},
        Renderer
      ]
    });
    injector = getTestBed();
    backend = injector.get(XHRBackend);
    translate = injector.get(TranslateService);
    renderer= injector.get(Renderer);
    backend.connections.subscribe((c: MockConnection) => connection = c);

  });


  it('should have fore languages', inject([ AppComponent ], (app: AppComponent) => {
    app.ngOnInit();
    expect(app.supportedLanguages.length).toBe(4);
  }));

我得到的错误是:

代码语言:javascript
复制
TypeError: undefined is not a constructor (evaluating 'renderer.listenGlobal') in config/spec-bundle.js

它看起来渲染器实例与实际浏览器环境中的行为不同。像往常一样,在CI环境中,我使用PhantomJS浏览器来执行测试。

EN

回答 1

Stack Overflow用户

发布于 2018-09-03 06:31:52

为什么我的答案被删除了?

这应该适用于Angular 6+

在你的component.spec.ts中

代码语言:javascript
复制
let renderer2: Renderer2;
...
beforeEach(async( () => {
   TestBed.configureTestingModule({
      ...
      providers: [Renderer2]
   }).compileComponents();
}));

beforeEach(() => {
   fixture = TestBed.createComponent(YourComponent);
   // grab the renderer
   renderer2 = fixture.componentRef.injector.get<Renderer2>(Renderer2 as Type<Renderer2>);
   // and spy on it
   spyOn(renderer2, 'addClass').and.callThrough();
   // or replace
   spyOn(renderer2, 'addClass').and.callFake(..);
   // etc
});

it('should call renderer', () => {
    expect(renderer2.addClass).toHaveBeenCalledWith(jasmine.any(Object), 'css-class');
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40196265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档