如何访问组件本身提供的私有服务进行单元测试

问题描述 投票:0回答:3

我有这个组件,它自己提供服务

@Component({
    selector: 'my-component',
    providers: [MyService],
    ...
})
export class MyComponent { 
  constructor(@Self() private service: MyService) {}
  ...
}

在单元测试期间我注意到以下内容

beforeEach(() => {
    TestBed.configureTestingModule({
        declarations: [MyComponent],
        providers: [MyService],
    }).compileComponents();
    service = TestBed.inject(MyService);
});

service
与我的组件内的服务不是同一个实例。我想这是有道理的,但我找不到解决方案,因为对于我的测试,我需要访问组件内的该服务。有什么建议吗?

angular unit-testing dependency-injection
3个回答
1
投票

在这种情况下,自备并不是去那里的正确方式。但如果你绝对必须这样做,那么你可以像这样获得访问权限:

TestBed.configureTestingModule({
    declarations: [MyComponent],
}).compileComponents();

const fixture = TestBed.createComponent(MyComponent);
service = (fixture.componentInstance as any).service;

请注意,

private
仅是编译时的,因此在运行时访问它并非不可能。不过,我仍然建议在模块级别提供服务。


1
投票

正如@johnrsharpe 在上面的评论中提到的,它的实现细节所以你不必处理它。这就是我所做的,但我只是找到了一种方法。我不再需要它,但出于教育目的,我无论如何都会展示它:

let myService: MyService;

beforeEach(() => {
    myService = { ... };

    TestBed.configureTestingModule({
        declarations: [MyComponent],
        providers: [MyService],
    }).overrideComponent(MyComponent, {
        set: {
            providers: [
                provide: MyService, useValue: myService
            ]
        }
    });
}).compileComponents();

现在您可以使用

myService
进行嘲笑和间谍活动!


0
投票

可以使用以下代码访问组件服务提供者实例:

  let service: MyService;
  let component: MyComponent;
  let fixture: ComponentFixture<MyComponent>;

beforeEach(() => {
    TestBed.configureTestingModule({
        declarations: [MyComponent],
        providers: [MyService],
    }).compileComponents();
    
});
 beforeEach(() => {
    fixture = TestBed.createComponent(MyComponent);
    component = fixture.componentInstance;
    service = fixture.componentRef.injector.get(MyService);

  });
© www.soinside.com 2019 - 2024. All rights reserved.