【问题标题】:Angular mock service on component level组件级别的 Angular 模拟服务
【发布时间】:2021-06-14 19:29:41
【问题描述】:

我必须模拟在组件级别而不是在模块级别注入的服务方法。 这是我的组件的样子:

@Component({
    selector: 'app-mycomponent',
    template: '<some html content>',
    ...
    providers: [MyService],
})
export class MyComponent implements OnInit {
    constructor(private myService: MyService) {}

    ngOnInit(): void {
        this.myService.myMethod();
    }
}

还有我的规范文件:

define('MyComponent', () => {
    let component: MyComponent;
    let fixture: ComponentFixture<MyComponent>;
    let service: MyService;
    
    beforeEach(waitForAsync(() => {
        TestBed.configureTestingModule({
            imports: [..some modules..],
            providers: [
                { provide: MyService, useClass: MyServiceStub }
            ],
        }).compileComponents();
    }));

    beforeEach(() => {
        fixture = TestBed.createComponent(MyComponent);
        component = fixture.componentInstance;
        service = TestBed.get(MyService);
        fixture.detectChanges();
    });

    it ('should call service method', () => {
        spyOn(service, 'myMethod');

        component.ngOnInit();

        expect(service.myMethod).toHaveBeenCalled();
    });
});

class MyServiceStub {
    myMethod(): void {}
}

当我运行npm test 时,TC 失败,抱怨没有调用预期的服务方法。如果我在模块级别提供服务,它会通过,但我需要它在组件级别,知道如何正确配置规范以使用组件级别提供的服务吗?

【问题讨论】:

  • 如果您在组件级别提供它,它就会成为一个实现细节,它是您正在测试的东西的一部分。要么把它移出,要么测试它做什么而不是它是否被调用。

标签: angular typescript unit-testing mocking karma-jasmine


【解决方案1】:

您可以为此使用TestBed.overrideComponent

// Override component's own provider
TestBed.overrideComponent(
   MyComponent,
   {set: {providers: [{provide: MyService, useClass: MyServiceStub}]}}
)
.compileComponents();

Angular documentation

【讨论】:

    猜你喜欢
    • 2017-07-30
    • 2021-02-23
    • 2019-06-15
    • 2017-07-08
    • 2020-04-19
    • 2017-02-16
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多