Angular с Jest: неудачный тест на невозможность найти провайдера с использованием другого импорта
У меня есть приложение Angular с Jest, и все тесты работают нормально. Компонент внедряет службу:
component.ts:
import { FooService } from '../../services/foo.service'; // relative import
constructor(private foo: FooService) {}
component.spec.ts:
import { FooService } from '@services/foo.service'; // alias import
describe('FooComponent', () => {
let component: FooComponent;
let fixture: ComponentFixture<FooComponent>;
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [....],
providers: [ { provide: FooService, useValue: { bar: () => {} } ],
declarations: [FooComponent],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
....
}));
});
Если оба импорта относятся к одному и тому же
foo.service.ts
, но с использованием другой формы импорта: псевдоним против относительного пути.
Псевдоним определяется в tsconfig.json:
"paths": {
"@services/*": ["./app/services/*"]
}
И конфигурация Jest:
"moduleNameMapper": {
"@services/(.*)": "<rootDir>/src/app/services/$1"
}
Я переключился на рабочую область nx, и тест начал давать сбой с сообщением об отсутствии поставщика для FooService :
NullInjectorError: R3InjectorError(DynamicTestModule)[FooService -> FooService]:
NullInjectorError: No provider for FooService!
Мне удалось исправить это, используя ту же форму импорта - и служба, и тест должны использовать либо импорт псевдонима, либо относительный импорт.
Хотелось бы понять, в чем тут проблема. Похоже, что Angular / Jest выполняет разрешение токена / зависимости инъекции на основе пути TypeScript (в рабочей области Nx). Есть какое-нибудь объяснение, как это работает?