javascript - 在 NgRX createEffect 调用中模拟 catchError
问题描述
我目前正在为以下调度事件编写测试:
@Injectable()
export class AuthEffects {
signIn$ = createEffect(() =>
this.actions$.pipe(
ofType(AuthActions.signIn),
switchMap((action) =>
from(this.loginService.signIn(action.email, action.password, action.redirectTo)).pipe(
map(() => AuthActions.signInSuccess()),
catchError((err: Error) =>
of(
AuthActions.signInError({
message: err.message,
})
)
)
)
)
)
);
constructor(
private actions$: Actions,
private loginService: LoginService
) {}
}
测试如下:
describe('AuthEffects', () => {
let effects: AuthEffects;
let actions$: Observable<Action>;
let mockLoginService: LoginService;
let mockSupabaseService: SupabaseService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [provideMockActions(() => actions$), AuthEffects],
});
effects = TestBed.inject(AuthEffects);
mockLoginService = TestBed.inject(LoginService);
mockSupabaseService = TestBed.inject(SupabaseService);
});
describe('signIn$', () => {
it('should allow sign in', () => {
const payload = { email: 'test@hotmail.com', password: '123', redirectTo: 'dashboard' };
actions$ = cold('a', { a: AuthActions.signIn(payload) });
jest.spyOn(mockSupabaseService, 'signIn').mockImplementation(() => Promise.resolve([]));
effects.signIn$.subscribe(() => {
expect(mockLoginService.signIn).toHaveBeenCalled();
});
});
it('should not allow sign in', () => {
const payload = { email: 'test@hotmail.com', password: '123', redirectTo: 'dashboard' };
const mockError = { name: 'test', message: 'test' };
actions$ = cold('a', { a: AuthActions.signIn(payload) });
jest.spyOn(mockSupabaseService, 'signIn').mockImplementation(() => {
return Promise.reject(mockError);
});
effects.signIn$.subscribe(() => {
expect(mockLoginService.signIn).toHaveBeenCalled();
});
});
});
});
我在模拟覆盖该catchError
方法所需的输出时遇到问题。每次运行测试时,都会出现以下错误:
console.error
Unhandled Promise rejection: { name: 'test', message: 'test' } ; Zone: ProxyZone ; Task: null ; Value: { name: 'test', message: 'test' } undefined
我该如何解决?
解决方案
让您的signIn
模拟调用 rxjsthrowError
运算符:
jest.spyOn(mockSupabaseService, 'signIn').mockImplementation(() => throwError(mockError));
推荐阅读
- c# - 从 .NET Web 应用程序向连接用户推送数据的最佳方式
- visual-studio - 如何使 MSBuild 不会因 .NET 解决方案上的错误而停止
- reactjs - 无法修复未处理的拒绝错误 -
- python-3.x - 将缺少的标题添加到数据框第一列
- javascript - 为单个文件禁用更漂亮
- asp.net - 如何在 IIS 8.5 上为 asp.net 项目启用 HSTS
- python - 检查字符串中是否存在字符串,无论是大写/小写/混合?
- javascript - 两个渲染函数都有相同的代码,但只有一个可以工作,为什么?
- core-data - 计算行之间的 CoreData 查询
- python-3.x - 尝试遍历 text() 节点以找到它们的父节点