【发布时间】:2018-11-11 09:37:25
【问题描述】:
我有一个扩展类 (BaseApi) 的可注入服务 (EntityApi)。在我的规范中,我喜欢用 BaseApiStub 模拟 BaseApi。但它是徒劳的。总是调用 EntityApi。
// class
export class BaseApi { // want to mock BaseApi
constructor(injector: Injector) {
console.log("Should not be here...");
}
}
// service
@Injectable()
export class EntityApi extends BaseApi {
constructor(injector: Injector) {
super(injector, "entity");
}
}
// component
@Component({
selector: 'rt-entity-list',
templateUrl: './entity-list.component.html',
})
export class EntityListComponent {
api: any;
constructor(public entityApi: EntityApi) {
this.api = entityApi;
}
}
// mock api
export class BaseApiStub { //mocked api
constructor() {
console.log("You are on track!!")
}
get() { }
}
// spec
describe('EntityListComponent', () => {
let component: EntityListComponent;
let fixture: ComponentFixture<EntityListComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [EntityListComponent],
providers: [ { provide: BaseApi, useClass: BaseApiStub }, // mocked class.
],
schemas: [NO_ERRORS_SCHEMA]
}).compileComponents();
beforeEach(() => {
fixture = TestBed.createComponent(EntityListComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
预期的行为是,在规范中编译组件时。它应该调用 BaseApiStub,而不是调用 BaseApi。我已经看到了如下解决方案。但没有运气。
export class BaseApiStub extends BaseApi { }
测试代码:stackblitz 检查控制台。我希望你是 正常!! 记录但收到不应该在这里...
无法更进一步。有人可以纠正我的错误吗?
【问题讨论】:
-
嗨 Premkumar,您的方法是正确的,但是您是否在 BaseApiStub 中为 BaseApi 方法提供了任何虚假/模拟实现? (因为根据你的 sn-p 它是空的)
-
我在 BaseApiStub 中添加了一个方法。仍然面临同样的问题。它正在调用 BaseApi。类模拟语法是否正确?通常,对于我曾经这样嘲笑的服务。但不确定课程。
-
这当然取决于您的测试条件,例如如果 BaseApi 和 BaseApiStub 在您的注射器中都可用,它只会解析找到的第一个。尝试直接覆盖您的提供程序以确保,如下所示:TestBed.overrideProvider(BaseApi, BaseApiStub)
-
我已经尝试了你的建议。通话仍然出错。我已经用 stackblitz 更新了我的问题。单元测试通过。但它不应该调用 BaseApi。检查控制台。
-
现在很清楚了,你先注册一个真正的 Api,然后你提供另一个实例,只做这个提供者:[{ provide: EntityApi, useClass: BaseApiStub }]
标签: javascript angular unit-testing jasmine