监视返回可观察对象的函数

Ger*_*son 3 unit-testing jasmine rxjs angular

我正在使用一个函数来测试一个Angular 4组件,该函数发出一个HTTP请求(返回一个observable),然后在observables subscribe方法中调用另一个函数.我想测试正确调用subscribe中的函数.该组件如下所示:

logIn(): void {
  this.loginService.logIn(user)
  .subscribe(() => {
    this.router.navigateByUrl('/')
  })
}
Run Code Online (Sandbox Code Playgroud)

我在组件规范中嘲笑了这项服务:

loginServiceStub = {
  logIn(user: User) {
    return Observable.of(true)
  },
}
Run Code Online (Sandbox Code Playgroud)

我已经将一个间谍附加到路由器和登录服务,以了解它们是否已被调用:

const logInSpy = spyOn(loginService, 'logIn')
const navigateByUrlSpy = spyOn(router, 'navigateByUrl')
Run Code Online (Sandbox Code Playgroud)

调用组件登录方法时,正在调用logInSpy,但没有调用navigateByUrlSpy,并且没有运行subscribe方法.我应该如何设置模拟logIn以使其正常工作?

Son*_*300 10

请尝试以下方法

存根:

loginServiceStub = {
  logIn: jasmine.createSpy('logIn').and.returnValue(Observable.of(true))
}
Run Code Online (Sandbox Code Playgroud)

在测试中:

const navigateByUrlSpy = spyOn(router, 'navigateByUrl').and.callThrough();
Run Code Online (Sandbox Code Playgroud)