Как проверить наблюдаемое в angular / jasmine, когда наблюдаемое следующее вызывается до того, как возвращается наблюдаемое из-за насмешек - PullRequest
0 голосов
/ 03 мая 2019

У меня есть следующий код

login(user: string, pass: string): Observable<User> {
    const subject = new Subject<User>();

    this.authApi.authTokenPost(user, pass)
        .subscribe((token: OAuthAccessToken) => {
            this.tokenService.save(token);
            this.userApi.fetch()
                .subscribe((user: User) => {
                    subject.next(user);
                });
        }) // removed error handling for brevity

    return subject;
}

Проблема, конечно, в том, что мне нужно два вызова API, поэтому тогда я решил это, создав новую тему и вернув ее.

Сейчас я пишу функциональный тест ..

const user: User = {id: '1234'};

const authApi = jasmine.createSpyObj('AuthApi', ['authTokenPost']);
const tokenService = jasmine.createSpyObj('TokenService', ['save']);
const userApi = jasmine.createSpyObj('UserService', ['fetch']);

beforeEach(() => {    
    authApi.authTokenPost.and.returnValue(of(oauthAccessToken));
    userService.fetch.and.returnValue(of(user));

    authenticationService = new AuthService(authApi, tokenService, userApi);
});

it('should login', (done) => {
    authService.login('user', 'pass')
        .subscribe((user2) => {
            expect(user2).toEqual(user);
            done();
        })
});    

Проблема в том, что из-за насмешек подписка вызывается немедленно, и поэтому subject.next(user) вызывается ДО того, как субъект даже будет возвращен ..

Кто-нибудь знает хороший способ обойти это?

1 Ответ

0 голосов
/ 03 мая 2019

Я нашел решение:

authApi.authTokenPost.and.returnValue(of(oauthAccessToken).pipe(delay(0)));

При задержке любой из фиктивных наблюдаемых даже на 0 микросекунд вызов становится асинхронным и, следовательно, выполняется после возврата субъекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...