如何测试两个串联的RxJS void Observables?

时间:2019-12-18 12:09:41

标签: angular typescript rxjs ts-mockito

我有以下代码:

@Injectable({
  providedIn: 'root'
})
export class LogoutCmd extends Command<User> {
  constructor(
    private readonly loginStore: LoginStore,
    @Inject(TOKEN_REPOSITORY_TYPE) private readonly tokenRepository: TokenRepository
  ) {
    super()
  }

  execute(): Observable<void> {
    return concat(this.tokenRepository.removeAccessToken(), this.tokenRepository.removeRefreshToken()).pipe(
      tap(() => {
        this.loginStore.patch({ isUserLoggedIn: false })
      })
    )
  }
}

这是我的考验:

import { LogoutCmd } from './logout-cmd'
import { capture, instance, mock, verify, when } from 'ts-mockito'
import { LoginStore } from './login-store'
import { TokenRepository } from '../domain/token/token-repository'
import { EMPTY, of } from 'rxjs'
import { take } from 'rxjs/operators'

describe('LogoutCmd', () => {
  // This test passes
  it('should remove tokens', async () => {
    const { tokenRepository, logoutCmd } = setup()

    await logoutCmd.execute().toPromise()

    verify(tokenRepository.removeAccessToken()).once()
    verify(tokenRepository.removeRefreshToken()).once()
  })

  // This test fails
  it('should set the user is logged in the store', async () => {
    const { logoutCmd, loginStore, tokenRepository } = setup()

    await logoutCmd
      .execute()
      .pipe(take(1))
      .toPromise()

    const [actual] = capture(loginStore.patch).last()
    expect(actual).toEqual({ isUserLoggedIn: false })
  })
})

function setup() {
  const loginStore = mock(LoginStore)
  const tokenRepository = mock<TokenRepository>()

  when(tokenRepository.removeRefreshToken()).thenReturn(EMPTY)
  when(tokenRepository.removeAccessToken()).thenReturn(EMPTY)

  return {
    loginStore,
    tokenRepository,
    logoutCmd: new LogoutCmd(instance(loginStore), instance(tokenRepository))
  }
}

问题是我无法访问tap内部的代码。我试图在其中放置一个断点,但从未触发过它。

我正在使用ts-mockito,但我不认为这是问题所在。

最后,removeAccessTokenremoveRefreshToken是可观察到的返回空值的

关于我在做什么错的任何想法?

0 个答案:

没有答案