使用 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'));
我希望我帮其他人解决了这个问题!
我正在尝试通过 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'));
我希望我帮其他人解决了这个问题!