棱角/茉莉花 - @Inject("窗口")会导致测试失败,删除它会导致代码失败



我正面临着在web API服务中使用Angular的@Inject('Window')的第22条军规。当它与服务构造函数中的Window注入一起使用时,测试规范在Jasmine/Karma环境中会失败,因为windows的依赖注入会失败。如果没有包含@Inject,则测试规范成功,但是在localhost中运行代码会导致相同的依赖注入错误。

@Injectable({
providedIn: 'root'
})
export class ApiService {
constructor(@Inject('Window') private w: Window) {...

在测试规范文件中,我像这样模拟Window对象来设置自定义位置:

describe('ApiService', () => {
let service: ApiService;
let fakeW: Window;
beforeEach(waitForAsync(() => {
fakeW = <any> {
location: <any> new URL("https://test.environment.com/")
};
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
{ provide: Window, useFactory: () => fakeW },
]
});
service = TestBed.inject(ApiService);

在构造函数中使用@Inject语句,依赖注入会失败:

ApiService should create FAILED
Failed: R3InjectorError(DynamicTestModule)[ApiService -> Window -> Window]:
NullInjectorError: No provider for Window!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'ApiService', 'Window', 'Window' ] })
NullInjectorError: R3InjectorError(DynamicTestModule)[ApiService -> Window -> Window]:
NullInjectorError: No provider for Window!

从构造函数中删除@Inject并只使用private w: Window会导致测试成功。但是,当代码在localhost中运行时,它会导致相同的提供程序错误。

我只需要改变我如何嘲笑窗口对象,以便@Inject可以使用它吗?

我认为你必须这样做:

// Add single quotes to Window because it is an injection token.
{ provide: 'Window', useFactory: () => fakeW },

查看这个答案了解更多细节:https://stackoverflow.com/a/70535517/7365461

最新更新