Angular 4 组件单元测试无法解析所有参数(?)
Angular 4 component unit test cannot resolve all parameters (?)
我正在尝试对我的组件进行单元测试,但基本测试失败。
cannot resolve all parameters for MyComponent(?.)
我尝试在组件的构造函数中添加 forwardRef(),但它仍然有效。但我不想因为测试失败而使用它,也不推荐使用它。
如有错字请忽略。我添加了代码片段。抱歉,我无法在此处添加实际代码。
源码
./服务
我的服务-c.ts
import { MyServiceQ } from './my-service-q';
...
@Injectable()
export class MyServiceC {
constructor(private myServiceQ: MyServiceQ) { }
...
getMyServiceQ(){
return this.myServiceQ;
}
}
./组件
我的-component.ts
import { MyServiceC } from '../services/my-service-c';
@Component() {...}
export class MyComponent {
private myServiceQ;
constructor(private myServiceC: MyServiceC) {
this.myServiceQ = this.myServiceC.getMyServiceQ();
}
}
my-component.spec.ts
import { MyServiceC } from '../services/my-service-c';
import { MockMyServiceC } from '../fixtures/mock-my-service-c';
import { MyComponent } from './my-component';
..other imports...
beforeEach( () => {
TestBed.configureTestingModule({
providers: [
{ provide: MyServiceC, useClass: MockMyServiceC }
],
declarations: [ MyComponent ]
});
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be defined',
() => expect(component).toBeDefined();
);
如果您有任何建议,请告诉我。很长一段时间以来,我一直在努力寻找解决方案。
提前致谢..
您在评论中表示“我有两个与实际服务相同的模拟服务(MockMyServiceC 注入 MockMyServiceQ)。”
目前您在测试中注入 MockMyServiceC
MockMyServiceC
的所有依赖项也必须解决,但您没有提供它们。
稍微更改一下测试应该可以解决您的问题:
TestBed.configureTestingModule({
providers: [
MockMyServiceQ,
{ provide: MyServiceC, useClass: MockMyServiceC }
],
declarations: [ MyComponent ]
});
一个提示:
这很快就会变得难以维护。您模拟的服务应该始终注入相同的真实服务。然后你可以像这样提供它们:
TestBed.configureTestingModule({
providers: [
{ provide: MyServiceQ, useClass: MockMyServiceQ },
{ provide: MyServiceC, useClass: MockMyServiceC }
],
declarations: [ MyComponent ]
});
否则你会直接注入 MockServices 并通过 useClass
提供它们。想想如果您的组件也注入 MyServiceQ,您的测试会发生什么。
我正在尝试对我的组件进行单元测试,但基本测试失败。
cannot resolve all parameters for MyComponent(?.)
我尝试在组件的构造函数中添加 forwardRef(),但它仍然有效。但我不想因为测试失败而使用它,也不推荐使用它。
如有错字请忽略。我添加了代码片段。抱歉,我无法在此处添加实际代码。
源码
./服务
我的服务-c.ts
import { MyServiceQ } from './my-service-q';
...
@Injectable()
export class MyServiceC {
constructor(private myServiceQ: MyServiceQ) { }
...
getMyServiceQ(){
return this.myServiceQ;
}
}
./组件
我的-component.ts
import { MyServiceC } from '../services/my-service-c';
@Component() {...}
export class MyComponent {
private myServiceQ;
constructor(private myServiceC: MyServiceC) {
this.myServiceQ = this.myServiceC.getMyServiceQ();
}
}
my-component.spec.ts
import { MyServiceC } from '../services/my-service-c';
import { MockMyServiceC } from '../fixtures/mock-my-service-c';
import { MyComponent } from './my-component';
..other imports...
beforeEach( () => {
TestBed.configureTestingModule({
providers: [
{ provide: MyServiceC, useClass: MockMyServiceC }
],
declarations: [ MyComponent ]
});
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be defined',
() => expect(component).toBeDefined();
);
如果您有任何建议,请告诉我。很长一段时间以来,我一直在努力寻找解决方案。 提前致谢..
您在评论中表示“我有两个与实际服务相同的模拟服务(MockMyServiceC 注入 MockMyServiceQ)。”
目前您在测试中注入 MockMyServiceC
MockMyServiceC
的所有依赖项也必须解决,但您没有提供它们。
稍微更改一下测试应该可以解决您的问题:
TestBed.configureTestingModule({
providers: [
MockMyServiceQ,
{ provide: MyServiceC, useClass: MockMyServiceC }
],
declarations: [ MyComponent ]
});
一个提示: 这很快就会变得难以维护。您模拟的服务应该始终注入相同的真实服务。然后你可以像这样提供它们:
TestBed.configureTestingModule({
providers: [
{ provide: MyServiceQ, useClass: MockMyServiceQ },
{ provide: MyServiceC, useClass: MockMyServiceC }
],
declarations: [ MyComponent ]
});
否则你会直接注入 MockServices 并通过 useClass
提供它们。想想如果您的组件也注入 MyServiceQ,您的测试会发生什么。