5

我有一个虚拟服务:

export class PatientService extends EntityCollectionServiceBase<Patient> {
  constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory) {
    super('Patient', serviceElementsFactory);
  }
}

我有以下测试:

describe('PatientService', () => {
  let service: PatientService;

  beforeEach(() => {
    TestBed.configureTestingModule({});
    service = TestBed.inject(PatientService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });
});

它给了我:

NullInjectorError: No provider for EntityCollectionServiceElementsFactory

所以我更新如下:

describe('PatientService', () => {
  let service: PatientService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [EntityDataModuleWithoutEffects.forRoot(entityConfig)],
      providers: [provideMockStore()],
    });
    service = TestBed.inject(PatientService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });
});

但现在它给了我:

NullInjectorError: No provider for ScannedActionsSubject!

如何正确修复我的测试?

4

3 回答 3

2

是的,你很亲密,就那样做吧。您需要在测试平台中提供配置所需的一切。

在我们的例子中,这意味着PatientService应该作为测试单元EntityCollectionServiceElementsFactory提供,并且应该作为它的依赖提供。

但有自己的EntityCollectionServiceElementsFactory依赖关系:EntityDispatcherFactoryEntityDefinitionService和. 我们不想提供,因为它们可能有自己的依赖关系,使我们的生活变得更糟。EntitySelectorsFactoryEntitySelectors$Factory

要修复它,让我们简单地 sub EntityCollectionServiceElementsFactory

describe('PatientService', () => {
  let service: PatientService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        PatientService,
        {
          provide: EntityCollectionServiceElementsFactory,
          // our stub
          useValue: {
            methodsToFake: jasmine.createSpy(),
            // ....
          },
        },
      ],
    });
    service = TestBed.inject(PatientService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });
});

此外,为了避免将来模拟依赖项及其方法的痛苦,您可以使用ng-mocks。然后测试可能如下所示:

describe('PatientService', () => {
  let service: PatientService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        PatientService,
        {
          provide: EntityCollectionServiceElementsFactory,
          useValue: MockService(EntityCollectionServiceElementsFactory),
        },
      ],
    });
    service = TestBed.inject(PatientService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });
});
于 2020-06-01T09:14:41.940 回答
2

如果您只需要摆脱错误,您可以像这样导入所有必需的模块:

   beforeEach(() => {
     TestBed.configureTestingModule({
       imports: [HttpClientTestingModule, EffectsModule.forRoot([]), StoreModule.forRoot({}), EntityDataModule.forRoot(entityConfig)],
     });
     service = TestBed.inject(PatientService);
   });
于 2021-03-02T07:39:59.500 回答
0

您必须设置整个数据模块,就像在“普通 Angular 模块”中一样。

这意味着,提供商店、效果和数据实体。

可能有更好的方法,但是……我不知道 ‍♂️</p>

于 2020-05-28T08:54:57.583 回答