我有以下代码:
@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,但我不认为这是问题所在。
最后,removeAccessToken
和removeRefreshToken
是可观察到的返回空值的
关于我在做什么错的任何想法?