角度测试-如何使用扩展的基类测试数据服务

时间:2019-04-01 22:07:16

标签: angular unit-testing jasmine jestjs angular-testing

我很难设置自己的数据服务测试,因此我尝试使用Testing with the Angular HttpClient API的这些文章SO Question中定义的HttpClientTestingModule,并且尝试了inject来自本文Testing HttpClient,但我无法使其正常工作。

我认为我的问题来自以下事实:我有一个全局DataService,它使用3个服务提供商(HttpClient中的ngx-translateNGXLoggerTranslateService )。然后,我有多个数据服务,它们像这样扩展了全局DataService

@Injectable()
export class UserDataService extends DataService {
  constructor(protected http: HttpClient, protected logger: NGXLogger, protected translate: TranslateService) {
  super(http, logger, translate);
  this.url = `api/users`;
}

getUsers(): Observable<Users[]> {
  return super.getAll<User[]>(this.url);
}

因此,如您所见,每个扩展数据服务(如UserDataServices)负责将3个必需的依赖项注入到super调用中。

我正在尝试使用以下代码对通过Jest完成的测试进行编码

describe('User Data Service', () => {
  let dataService: TemplateDataService;
  let httpTestingController: HttpTestingController;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpClientTestingModule,
        TranslateModule.forRoot(),
        LoggerModule.forRoot({ level: NgxLoggerLevel.ERROR, serverLoggingUrl: 'api/logging', serverLogLevel: NgxLoggerLevel.ERROR }),
      ],
      providers: [
        UserDataService
      ]
    });
    dataService = TestBed.get(UserDataService);
    httpTestingController = TestBed.get(HttpTestingController);
  });

it('should return an Observable<User[]>', () => {
  const dummyUsers = [
    { login: 'John' },
    { login: 'Doe' }
  ];

  dataService.getAll().subscribe((users: User[]) => {
    expect(users.length).toBe(2);
    expect(users).toEqual(dummyUsers);
  });

  const req = httpTestingController.expectOne(`api/users`);
  expect(req.request.method).toBe('GET');
  req.flush(dummyUsers);
});

并且不断抛出以下错误

Unexpected value 'HttpClientModule' imported by the module 'HttpClientTestingModule'. Please add a @NgModule annotation.

我也尝试过这段代码,但是我遇到了同样的错误

it(
  'should get users',
  inject(
    [HttpTestingController, NGXLogger, TranslateService, DataService],
    (
      httpMocker: HttpTestingController,
      logger: NGXLogger,
      translate: TranslateService,
      dataServicer: DataService
    ) => {
      // ...our test logic here
    }
  )
);

我对单元测试还不陌生(我从上周开始),而对任何数据服务的测试都一无所知(从好的方面来说,我可以使用数据服务模拟来测试组件,但我也想测试这些数据服务。

在技术方面,该项目使用Angular: ^7.2.10jest: ^23.6.0

编辑

我忘了提到DataService也是一项服务,我也尝试将其添加到providers中的beforeEach()中,但仍然收到相同的错误({{1} }。如下图所示

Unexpected value 'HttpClientModule'...

这里也要简要介绍beforeEach(() => { TestBed.configureTestingModule({ imports: [ HttpClientTestingModule, TranslateModule.forRoot(), LoggerModule.forRoot({ level: NgxLoggerLevel.ERROR, serverLoggingUrl: 'api/logging', serverLogLevel: NgxLoggerLevel.ERROR }), ], providers: [ DataService, UserDataService ] }); }); ,这是它的简化版本。

DataService

编辑2

我想我正在寻找的是如何对扩展类进行单元测试,它实际上是在Angular仓库here中提出的,但从未得到回答和关闭,因为这不是问题,而是更多题。

0 个答案:

没有答案