【发布时间】:2019-01-31 23:44:27
【问题描述】:
发现了几个类似的错误,但我认为它们不适用。他们谈论组件的顺序,我想我已经尝试了一切。
我正在为现有服务编写新的单元测试。这是服务构造函数:
@Injectable()
export class CreateSpAuthorizationUtility {
constructor(
private dialogService: DialogService,
private router: Router,
private store: Store<AppStore>,
private noteService: NoteService,
private stepperService: StepperService
) {
}
}
这是我写的单元测试:
describe('Given a CreateSpAuthorizationUtility', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
],
imports: [
HttpClientTestingModule
],
providers: [
AppConfig,
HttpRequest,
CreateSpAuthorizationUtility,
{provide: DialogService, useClass: MockDialogService},
{provide: NoteService, useClass: MockNoteService},
{provide: Router, useClass: MockRouter},
{provide: StepperService, useClass: StepperServiceMock},
{provide: Store, useClass: TestStore}
]
});
}));
it('should build query params',
inject([CreateSpAuthorizationUtility, HttpTestingController, AppConfig],
fakeAsync( (service: CreateSpAuthorizationUtility,
mockBackend: HttpTestingController,
appConfig: AppConfig,
router: MockRouter,
store: TestStore<AppStore>,
dialogService: MockDialogService,
noteService: MockNoteService,
stepperService: StepperServiceMock) => {
const prescreen: SpPrescreenSelectedValues = SP_PRESCREEN_SELECTED_VALUES_MOCK;
service.buildQueryParams(prescreen, false);
})));
});
这里是 MockNoteService:
@Injectable()
export class MockNoteService extends NoteService {
public static NON_EXISTING_ID = 'nonExistingId';
public getNoteDefinition(noteDefinitionVisibleId: string): Observable<NoteDefinition> {
if (noteDefinitionVisibleId === MockNoteService.NON_EXISTING_ID) {
return observableThrowError('Test');
}
return of({
id: '',
version: 0,
name: '',
description: '',
attributeDefs: [],
visibleId: '',
userCreatable: false,
instanceCopyable: false,
definitionEditable: false,
isSystem: false,
bodyRequired: true
});
}
}
扩展了 NoteService:
export class NoteService extends BaseService {
constructor(private http: HttpRequest, private appConfig: AppConfig, private store: Store<AppStore>) {
super();
}
}
当我运行它时,我收到以下错误:
Error: Can't resolve all parameters for HttpRequest: (?, ?, ?, ?).
at syntaxError (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:1021:1)
at CompileMetadataResolver.push../node_modules/@angular/compiler/fesm5/compiler.js.CompileMetadataResolver._getDependenciesMetadata (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:10922:1)
at CompileMetadataResolver.push../node_modules/@angular/compiler/fesm5/compiler.js.CompileMetadataResolver._getTypeMetadata (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:10815:1)
at CompileMetadataResolver.push../node_modules/@angular/compiler/fesm5/compiler.js.CompileMetadataResolver._getInjectableTypeMetadata (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:11037:1)
at CompileMetadataResolver.push../node_modules/@angular/compiler/fesm5/compiler.js.CompileMetadataResolver.getProviderMetadata (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:11046:1)
at http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:10984:1
at Array.forEach (<anonymous>)
at CompileMetadataResolver.push../node_modules/@angular/compiler/fesm5/compiler.js.CompileMetadataResolver._getProvidersMetadata (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:10944:1)
at CompileMetadataResolver.push../node_modules/@angular/compiler/fesm5/compiler.js.CompileMetadataResolver.getNgModuleMetadata (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:10663:53)
at JitCompiler.push../node_modules/@angular/compiler/fesm5/compiler.js.JitCompiler._loadModules (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:23876:1)
正如我所说,我已经尝试对项目中的其他单元测试进行排序和比较。我不确定下一步该怎么做。
【问题讨论】:
-
我没有看到导入,但我假设您使用原始的
HttpRequest类及其实现,并且 测试模块 有问题,因为它无法解析正在尝试的参数注入。 -
@Buczkowski,我查看了 HttpRequest,它需要 HttpHeaders 和 HttpParams,但我正在编码的测试不会导入这些。我尝试将它们放在 TestBed 设置的导入部分中,但它只是混淆了它。
-
完全删除它,您已经为您在构造函数中注入的依赖项提供了 Mocks。
-
@Buczkowski 这让我明白了:错误:StaticInjectorError(DynamicTestModule)[NoteService -> HttpRequest]: StaticInjectorError(Platform: core)[NoteService -> HttpRequest]: NullInjectorError: No provider for HttpRequest!
-
这意味着
NoteService将HttpRequest作为依赖项,或者至少这是我的想法,但是由于您为其提供了Mock,因此它的意义不大...您能证明MockNoteService吗?
标签: angular typescript jasmine karma-jasmine