【发布时间】:2018-04-08 03:57:57
【问题描述】:
类似于this question 上的typemoq 注入,如何将ts-mockito 对象注入到angular 的TestBed.configureTestingModule() 中?我能找到的任何example ts-mockito 测试都与角度无关。
考虑以下要测试的最小工作示例——它包含一个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 测试框架通过TestBed 引入依赖注入。 我们如何在 Angular 的测试设置中使用 mockito? 例如,如何使 sn-p injector.get(ProgressService) 与 ts-mockito 模拟兼容?
【问题讨论】:
-
class MockProgressService extends ProgressService没有多大意义,所以不清楚 ts-mockito 对象有什么问题。您可以使用useValue: ...或useFactory: () => ...使用您想要的任何对象模拟服务 -
角度教程通过扩展实际模拟的类来创建模拟对象。所以 MockProgressService 只是扩展 ProgressService (在这种情况下并没有覆盖方法)。所以不是 useClass,我应该 useValue 引用我手动实例化的 mockito 对象?
-
是的,就是这样。我不确定该教程的意义何在,但出于实际原因,通常在模拟的课程中扩展真实课程是不可以的。
标签: angular unit-testing typescript