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). Есть какое-нибудь объяснение, как это работает?

0 ответов

Другие вопросы по тегам