使用 jasmine 测试 NGXS 异常

Testing NGXS exceptions with jasmine

我正在尝试通过 ngxs 为我们的 Angular 应用程序执行的操作编写单元测试。在我的一个测试中,我期望该操作会引发错误。我尝试使用

expect(function() {store.dispatch(new MyAction(param));}).toThrowError();

但它给了我 "Expected function to throw an Error." 消息,即使我在控制台中看到错误。这次失败后,我尝试了以下操作:

let errorMessage;
try {
    store.dispatch(new MyAction(param));
} catch (error) {
    console.log("In catch!");
    errorMessage = error;
}
expect(errorMessage).toBe(myErrorMessage);

我再次在我的控制台中看到错误,但我没有在我的 catch 子句中看到 "In catch!" console.log。经过一些研究,我发现 angular 有它自己的 ErrorHandler,它在 jasmine 可以对它做一些事情之前捕获这个错误。您如何防止这种情况发生?

答案是:使用 jasmine 模拟 angular ErrorHandler!首先创建一个间谍:

export const errorHandlerSpy = () => jasmine.createSpyObj('ErrorHandler', {
    handleError: undefined
});

在您的测试中使用这个间谍作为提供者:

beforeEach(async(() => {
    TestBed.configureTestingModule({
        imports: [NgxsModule, /*other imports*/],
        providers: [
            { provide: ErrorHandler, useFactory: errorHandlerSpy }
        ]
    }).compileComponents();
}));

检查这样抛出的错误:

const errorHandler = TestBed.get(ErrorHandler);
store.dispatch(new MyAction(param));
expect(errorHandler.handleError).toHaveBeenCalledWith(new Error('Your error message'));

我希望我帮其他人解决了这个问题!