【问题标题】:Angular 4 component unit test cannot resolve all parameters (?)Angular 4 组件单元测试无法解析所有参数(?)
【发布时间】:2018-01-07 11:43:10
【问题描述】:

我正在尝试对我的组件进行单元测试,但基本测试失败。
cannot resolve all parameters for MyComponent(?.)

我尝试在组件的构造函数中添加 forwardRef() ,但它可以工作。但我不想仅仅因为测试失败而使用它,不推荐使用它。

如有错别字请忽略。我已经添加了代码 sn-p。抱歉,我无法在此处添加实际代码。


./services
my-service-c.ts

import { MyServiceQ } from './my-service-q';
    ...
    @Injectable()
    export class MyServiceC {
        constructor(private myServiceQ: MyServiceQ) { }
        ...
        getMyServiceQ(){
            return this.myServiceQ;
        }
    }

./components
my-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();
    );      

如果您有任何建议,请告诉我。我一直在努力寻找解决方案。 提前谢谢..

【问题讨论】:

  • 在我查看您的测试之前,请问您为什么要这样处理您的服务?为什么不直接在组件中注入serviceQ
  • 抱歉,这是要求。我不应该直接暴露 serviceQ。
  • 好的,但它似乎是一个Injectable(),所以你也必须提供它,或者它是如何注入到你的MockMyServiceC 中的?
  • @lexith 是的,抱歉,已删除;我误读了这个例子。 OP,请给一个连贯的minimal reproducible example,这里的省略号没有多大意义。
  • @jonrsharpe 没问题 :)

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


【解决方案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,您的测试会发生什么。

【讨论】:

  • 我会尝试并告诉你结果。谢谢
  • 我有个问题。即使我们在 MockMyServiceC this.mockMyServiceQ = new MockMyServiceQ(); 而不是构造函数参数中的 DI 中完成此操作,上述解决方案也将起作用
  • 您的意思是,如果您这样做,您在问题中的方法是否有效?可能,如果你不注入它。
  • 必须对其进行测试,但我认为它应该可以工作。它没有被注入,也没有其他类会注入它,因此不需要提供它。在任何其他情况下,它只是一个普通的类。
  • 它不起作用。我尝试了答案中的两个选项(有和没有 DI)。
猜你喜欢
  • 1970-01-01
  • 2017-11-13
  • 2016-11-18
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2017-11-20
  • 1970-01-01
相关资源
最近更新 更多