我正在尝试对我的组件进行单元测试,但基本测试失败了
cannot resolve all parameters for MyComponent(?.)
我尝试在我的组件构造函数中添加forwardRef()但它可以工作。但我不想仅仅因为测试失败而使用它而且不建议使用它。
如果有任何拼写错误,请忽略。我添加了代码段。抱歉,我无法在此处添加实际代码。
SRC
./services
我服务-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();
}
}
我-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();
);
如果您有任何建议,请与我们联系。我一直试图找到解决方案很长一段时间。 提前谢谢..
答案 0 :(得分:1)
您在评论中说“我有两个模拟服务(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,请考虑测试会发生什么。