如何在Angular 6中将组件范围的服务替换为间谍对象?

时间:2018-08-02 09:03:59

标签: angular dependency-injection scope jasmine angular-services

目前,我(上下文:我是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进行单元测试?

1 个答案:

答案 0 :(得分:1)

您的方法行不通,因为您在AuthService级别替换了TestBed,并且在组件级别提供了服务。

您可以用TestBed.overrideProvider完全替换提供程序。

尝试一下:

TestBed.overrideProvider(AuthenticationService, { useValue: authServiceSpy });

此外,请确保在覆盖提供程序之后调用TestBed.compileComponents()