Angular 4组件单元测试无法解析所有参数(?)

时间:2017-07-31 19:20:11

标签: angular unit-testing dependency-injection angular-components

我正在尝试对我的组件进行单元测试,但基本测试失败了 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();
    );      

如果您有任何建议,请与我们联系。我一直试图找到解决方案很长一段时间。 提前谢谢..

1 个答案:

答案 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,请考虑测试会发生什么。