我很难设置自己的数据服务测试,因此我尝试使用Testing with the Angular HttpClient API的这些文章SO Question中定义的HttpClientTestingModule
,并且尝试了inject
来自本文Testing HttpClient,但我无法使其正常工作。
我认为我的问题来自以下事实:我有一个全局DataService
,它使用3个服务提供商(HttpClient
中的ngx-translate
,NGXLogger和TranslateService )。然后,我有多个数据服务,它们像这样扩展了全局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.10
和jest: ^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中提出的,但从未得到回答和关闭,因为这不是问题,而是更多题。