Angular 2 : Replace injected Renderer with jasmine spy object in component shallow tests

标签 angular testing dependency-injection mocking

zippy.component.ts:

import { Component } from '@angular/core';
  import {ZippyService} from '../services/zippy.service'
  import {Renderer} from '@angular/core'

  @Component({
    selector: 'app-zippy',
    templateUrl: './zippy.component.html',
    styleUrls: ['./zippy.component.less']
  })
  export class ZippyComponent {
    doNotShow:boolean = true;

    text:string;
    constructor(private zippyService:ZippyService, private renderer:Renderer) {
      this.text = this.zippyService.getText();
    }

    toggleDisplay() {
      this.doNotShow = !this.doNotShow;
    }

  }

zippy.component.spec.ts

describe('Zippy component shallow tests', ()=>{
            let fixture:ComponentFixture<ZippyComponent>, 
                component: ZippyComponent;

            let rendererMock = jasmine.createSpyObj('rendererMock', ['myFakeMethod']);
            beforeEach(async(() => {

                TestBed.configureTestingModule({
                    declarations: [ZippyComponent, ZippyPipe],
                    providers: [
                        { provide: ZippyService, useValue: zippyServiceMock },
                        { provide: Renderer, useValue: rendererMock }
                    ],
                    schemas: [NO_ERRORS_SCHEMA]
                });

                TestBed.compileComponents().then(()=>{
                    fixture = TestBed.createComponent(ZippyComponent);
                    component    = fixture.componentInstance;
                });
            }));
       ... 
       });

使用 karma 调试创建的组件表明正在注入(inject) zippyServiceMock 而不是 ZippyService。 但是注入(inject)的不是 rendererMock,而是真正的渲染器。 如何在我的测试中注入(inject) rendererMock 而不是真正的?

最佳答案

您正在覆盖整个模块的渲染器。但是你应该只为你的组件覆盖渲染器:

    TestBed.configureTestingModule({
                declarations: [ZippyComponent, ZippyPipe],
                providers: [
                    { provide: ZippyService, useValue: zippyServiceMock }
                ],
                schemas: [NO_ERRORS_SCHEMA]
            })                
    .overrideComponent(ZippyComponent, {
         set: {
             providers: [
                  {provide: Renderer, useValue: rendererMock}
             ]
        }
     });

    TestBed.compileComponents().then(()=>{
        fixture = TestBed.createComponent(ZippyComponent);
        component    = fixture.componentInstance;
    });

关于 Angular 2 : Replace injected Renderer with jasmine spy object in component shallow tests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42838164/

相关文章:

javascript - 我不明白在 Controller 中使用 $inject

angularjs - 为什么主模块的服务在其他模块中可用?

javascript - 如何使用 ngx-mqtt 库在 angular 6 中创建多个连接?

javascript - 无法根据条件更改输入背景

testing - 简单模拟 - 如何?

c# - 使用 IoC 容器的合适情况?

Angular 翻译插件未启动

node.js - 异常 : Token must be defined

testing - 我是使用 Selenium 进行自动化测试的新手。运行自动化测试需要什么?

c# - 由于 'System.DateTime' 准确度,成组运行时单元测试运行速度过快