目前,我(上下文:我是Angular初学者)正在使用jasmine-tests和Angular 6在更大的项目中开发一个简单的登录屏幕。为了与后端通信,我们使用连接到不同端点的websocket。因此,我必须为两个服务定义组件范围的提供程序:
// user-password-form.component.ts
@Component({
selector: 'app-user-password-form',
templateUrl: './user-password-form.component.html',
styleUrls: ['./user-password-form.component.scss'],
providers: [WebSocketService, AuthenticationService]
})
现在,我想通过模拟使用user-password-form.component.ts
的{{1}}来测试AuthenticationService
的某些功能。其他不同的服务也使用WebSocketService。 user-password-form.component仅使用WebSocketService
,但是由于层次结构DI,我还必须在组件范围内提供WebSocketService才能接收自己的实例。
现在,对于茉莉花,我想通过定义以下规范来测试组件的功能
AuthenticationService
但是,在这种情况下,不会注入间谍而不是真实的authenticationService。因此,我无法运行以下行:
const authServiceSpy
= jasmine.createSpyObj('AuthenticationService', ['authenticate']);
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [UserPasswordFormComponent],
providers: [LoggerService, FormBuilder,
{provide: AuthenticationService, useValue: authServiceSpy}
],
imports: [RouterModule],
schemas: [NO_ERRORS_SCHEMA]
})
如何强制注入机制使用spyObject代替真正的AuthenticationService进行单元测试?
答案 0 :(得分:1)
您的方法行不通,因为您在AuthService
级别替换了TestBed
,并且在组件级别提供了服务。
您可以用TestBed.overrideProvider
完全替换提供程序。
尝试一下:
TestBed.overrideProvider(AuthenticationService, { useValue: authServiceSpy });
此外,请确保在覆盖提供程序之后调用TestBed.compileComponents()
。