【问题标题】:Angular, unit testing a component that creates a service via an interfaceAngular,对通过接口创建服务的组件进行单元测试
【发布时间】:2020-01-09 01:43:39
【问题描述】:

给定这个在本地创建服务的组件

@Component({
    <removed for clarity>
    providers: [
        { provide: 'IMyService', useClass: MyService },
    ]
})
export class MyComponent implements OnInit, OnDestroy, AfterViewInit
{
    constructor(private data: IMyService){}
}

我一直在尝试在单元测试中提供服务,像这样

beforeEach(async(() =>
{
    TestBed.configureTestingModule({
        declarations: [MyComponent],
        providers: [
            { provide: 'IMyService', useClass: MockMyService },
        ]
    })
    /*
        .overrideProvider('IMyService', { useValue: MockMyService })
        .overrideComponent(MyComponent, {
        set: {
            providers: [
                { provide: 'IMyService', useClass: MockMyService }
            ]
        }
    })
   */
.compileComponents();

注释掉的部分是我尝试过的东西。

但我经常收到此消息

Failed: Can't resolve all parameters for MyComponent: (?)

我在这里错过了什么?

【问题讨论】:

  • 快速提问,但是 MyService 是否使用 @Injectable 正确注释?
  • 您能否检查IMyService 的导入。您是否从正确的路径导入?
  • (1) MockMyService 用@Injectable 注释,这就是我想要使用的服务 (2) 我确实尝试导入 IMyService,但因为它在单元测试中被称为字符串,所以它没有出现在进口中使用(即,它是不同的颜色)NB。实际组件有效,但单元测试无效

标签: angular angular-unit-test


【解决方案1】:

我想我找到了答案

https://stackoverflow.com/a/47451244/220545

constructor(
@Inject('IMyService') private data: IMyService,

正如评论所说,“这对我有用。没有注入,应用程序运行良好。但是,通过 ng 测试,似乎需要注入。我使用的是 Angular 6”

另外,你只需要在单元测试中使用overrideProvider,但是对于在组件范围内创建的提供者,你确实需要它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多