Jasmine .and.throwError() 在原始代码中没有被 .catch 捕获

Jasmine .and.throwError() is not caught by .catch in original code

我正在为一个函数编写测试,并且必须触发该函数的 .catch 部分,但 Jasmine 的间谍出于某种原因不能这样做。 待测方法:

foo(){
doStuff()
.catch((error) => {
    //stuff I still have to test
    bar()
})

}

doStuff() returns 一个 Promise(因此是 .catch-Setup),但是对于这个测试它应该抛出一个错误。

这是我的测试:

it('tests the error handling of foo',(done) =>{
spyOn(object,'foo').and.throwError('Test Error');

object.foo();

expect(object.bar).toHaveBeenCalled();
done();

});

我处理这个问题的方式是错误的吗?这是茉莉花的错误吗? (Google 没有找到任何东西) [我坚持(完成)设置,因为几乎所有其他测试都是异步的,我想保持这种风格]

[我无法更改要测试的代码]

我想我遇到了与您类似的问题。这是我的解决方法

import { throwError } from 'rxjs';

it(`...`, fakeAsync(() => {
    spy = spyOn(authService, 'signIn').and.returnValue(throwError(loginError));
    /* do things */
    expectSnackbar('error', loginError);
    expect(authService.ensureLogin).toHaveBeenCalled(); 
}));

调用 signIn 方法的方式如下:

return this.authService
    .signIn(payload.email, payload.password)
    .map((userId: string) => {
        // Whatever
    })
    .catch(error => {
        // Do something with the error
    });

以及抛出的错误在 signIn 中的样子

public signIn(email: string, password: string): Observable<string> {
    return this.jsonServerService.get('login').pipe(
        map(users => {
            if (/* valid */) {
                return user.userId;
            } else {
                throw new Error('Error');
            }
        }),
    );
}

如果您调用 and.throwError(...);,则会在测试方法中抛出错误。

您可以尝试 return Promise 拒绝:

spyOn(object, 'foo').and.rejectWith(new Error('Test Error'));

and.throwError 我试的时候不存在。也许我用的是旧版本的 jasmine。

我通过返回承诺拒绝来让它工作:

and.returnValue(Promise.reject({response: {status: 401}}))