gpt4 book ai didi

javascript - Angular :如何在单元测试中模拟扩展类

转载 作者:行者123 更新时间:2023-12-04 15:54:18 25 4
gpt4 key购买 nike

我有一个扩展类(BaseApi)的可注入(inject)服务(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 { }

Test Code: stackblitz Check the console. I expect the You are on track!! log but received as Should not be here...



无法更进一步。有人可以纠正我的错误吗?

最佳答案

你试图做的事情不起作用。依赖注入(inject)和类继承没有直接关系。这意味着您不能像这样切换服务的基类。

在我看来,您有两种方法可以做到这一点。

选项 1:

而不是模拟您的 BaseApi 并在您的测试中提供模拟,您需要模拟您的 EntityApi 并在您的测试中提供这个模拟。

选项 2:

您可以保留 BaseApi 一个简单的服务并将其作为依赖项提供,而不是让您的 EntityApi 从 BaseApi 扩展。

代替

class EntityApi extends BaseApi {
constructor(private injector: Injector) {

你做
class EntityApi {
constructor(private api: BaseApi) {

如果您像这样设置 EntityApi,它不会从 BaseApi 扩展,而是将其作为依赖项。然后,您可以创建 BaseApi 的模拟,并像在测试中那样提供它。

编辑

关于您的评论:

Since I should be using methods from BaseApi I cannot go without extends.



这不是真的。假设 BaseApi 有一个您想要使用的方法 foo()。扩展基类时,用法可能如下所示:
class EntityApi extends BaseApi {
constructor(private injector: Injector) {}
exampleMethod() {
this.foo();
}
}

如果您只有依赖项,您仍然可以像这样调用该方法:
class EntityApi {
constructor(private api: BaseApi) {}
exampleMethod() {
this.api.foo();
}
}

您无需从 BaseApi 扩展即可在其上调用方法。

关于javascript - Angular :如何在单元测试中模拟扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50640125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com