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}}))
我正在为一个函数编写测试,并且必须触发该函数的 .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}}))