angular - 如何将 ts-mockito 注入(inject) Angular 4 组件测试

标签 angular unit-testing typescript

类似于this question关于 typemoq 注入(inject),我该如何注入(inject) ts-mockito对象到 Angular 的 TestBed.configureTestingModule() 中?任何example ts-mockito我能找到的测试与 Angular 无关。

考虑下面的最小工作示例来测试 - 它包含一个 ProgressComponent,以及我们正在模拟的后端上的 ProgressService。该服务非常琐碎:

import { Injectable } from '@angular/core';

@Injectable()
export class ProgressService {
    private currentState: string = '1';

    constructor() {
    }

    setCurrentState(state: string) {
        this.currentState = state;
    }

    getCurrentState(){
        return this.currentState
    }

}

要在没有 ts-mockito 的情况下模拟它,我们只需扩展该类即可。

import {ProgressService} from "../../../progress.service";

export class MockProgressService extends ProgressService{}

然后在测试 ProgressComponent 时,MockProgressService 被传递到 TestBed。

import {async, ComponentFixture, getTestBed, TestBed} from '@angular/core/testing'

import { ProgressComponent } from './progress.component'
import {ProgressService} from "../progress.service"
import {MockProgressService} from "../shared/services/progress/progress.mock";

describe('ProgressComponent', () => {
  let injector: TestBed
  let mockService: ProgressService
  let fixture: ComponentFixture<ProgressComponent>
  let component: ProgressComponent

  beforeEach(async() => {
    TestBed.configureTestingModule({
      declarations: [ ProgressComponent ],
      providers: [{provide: ProgressService, useClass: MockProgressService}]
    }).compileComponents()

    injector = getTestBed()
    fixture = TestBed.createComponent(ProgressComponent)
    component = fixture.componentInstance
    mockService = injector.get(ProgressService)

    fixture.detectChanges();
  });
});

Angular Testing 框架通过 TestBed 引入依赖注入(inject)。 我们如何在 Angular 的测试设置中使用mockito?例如,如何使代码片段 injector.get(ProgressService) 与 ts-mockito 模拟兼容?

最佳答案

如果应使用另一个对象而不是类来模拟提供程序,则应使用 useValueuseFactory

对于 Jasmine 来说是:

providers: [{
  provide: ProgressService,
  useValue: jasmine.createSpyObj('ProgressService', [...])
}]

对于 ts-mockito 来说,它可以是:

progressServiceMock = mock(ProgressService);
...
providers: [{provide: ProgressService, useValue: instance(progressServiceMock)}]

虽然从原始类继承模拟类(例如class MockProgressService extends ProgressService)通常没有任何好处。如果目的是模拟某些方法,可以在真实的类实例或类原型(prototype)上使用 jasmine.spy(或当前测试框架具有的对应项)来模拟它们。当一个类不是当前单元测试中测试的类时,模拟/ stub 所有方法而不是几个方法有利于测试隔离。

关于angular - 如何将 ts-mockito 注入(inject) Angular 4 组件测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46959896/

相关文章:

angular - 如何使用 golang 作为 API 服务器在 angular-4 中使用 JWT 获取用户的登录状态

unit-testing - 由于错误,无法测试我的 grails 应用程序

javascript - 如何在 Ionic 的 html 元素 id 中获取当前的 ion-slide?

angular - ngClass 没有得到应用

Angular 垫选择列表在搜索输入时无法按预期工作

scala - 当我将 Play 项目拆分为子模块时,我在哪里放置测试

reactjs - 使用 Jest 运行测试时无法访问窗口属性

javascript - 更改 mat-icon-button 的大小

typescript - 设置 InlinePicture 宽度时的一般异常

unit-testing - 如何在 Angular 2 单元测试中访问被覆盖的子组件的模板?