仅供参考:我正在使用19.1.0
karma 的角度
假设我们有此服务和组件
// NOT PROVIDED IN ROOT!
@Injectable()
export class TestService {
getData(): string {
return 'this is real data'
}
}
// Standalone component!
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrl: './app.component.scss',
providers: [TestService]
})
export class AppComponent {
service = inject(TestService)
}
正如您所注意到的,该服务不是在根中提供的,而是在组件中提供的,并且也被注入。我注意到,使用此设置我无法在 karma 单元测试中模拟此服务。我可以看到它与组件中提供的服务有关,但我不确定如何修复它。以下是测试的片段。
describe('AppComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [AppComponent],
providers: [{
provide: TestService,
useValue: {
getData: () => ('mocked data'),
}
}]
}).compileComponents();
});
it('should create the app', () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.componentInstance;
expect(app).toBeTruthy();
console.log(app.service.getData())
});
});
我应该期望在这里app.service.getData()
应该注销"mocked data"
,但是,我得到了"this is real data"
。
该组件没有模拟服务(可能是因为它未在应用程序的根目录中提供)。因此,尝试
overrideProvider
配置模拟服务的方法,此方法有效。