【发布时间】:2017-06-26 20:50:11
【问题描述】:
我正在编写一个 Angular2 程序。它获取“州”列表(如 NY、NJ、OH、WY 等)并将它们显示在表单上。够好了。现在是 Karma 中的测试套件。
我有fake OptionService testing OK,但现在想测试错误处理。
使用与成功异步获取相同的 beforeEach() 我有这个异常处理测试:
it('getOptions() should throw an exception',
async(inject([OptionService], (optionService: OptionService) => {
mockBackend.connections.subscribe(
(connection: MockConnection) => {
connection.mockRespond(new Response(new ResponseOptions(
// Option 1:
{ body: [], status: 404 }
// Option 2:
//Observable.throw('Error from mock Http call for getOptions')
)));
});
optionService.getOptions()
.subscribe(
options => {
expect(options.length).toBe(1);
expect(options[0].id = 'NJ');
expect(options[0].name = 'New Jersey');
expect(options[0].topic = Option.TOPIC_STATE);
},
error => { expect(error == 'Error from mock Http call for getOptions') }
);
})
));
当使用选项 1 或选项 2(见代码)时,我得到了相同的结果。 subscribe() 的第一个函数获取结果,而第二个函数——假定的错误处理程序——没有被调用。
当执行选项 1 时 (options.length = 0) 并且由于没有选项 [0],expect() 会抱怨。据我了解,它根本不应该执行。
执行选项 2 时 (options = undefined) 和我得到几乎相同的错误(“'undefined' has no 'id' property”)。
所以我的问题:
如果 http get() 失败,它会返回一个好的 JSON 对象还是抛出一些东西?也许我没有期待正确的数据。
不应该调用错误函数(.subscribe() 的第二个参数)吗?我必须改变什么才能让它发生在我身上?
谢谢,
杰罗姆。
2/10/17 更新: 亚历克斯的回答是正确的。我想分享我在准备模拟数据方面学到的一些知识。
在测试 OptionService 时,我准备了模拟数据:
connection.mockRespond(new Response(
new ResponseOptions({
body: [ { id: 'NJ', name: 'New Jersey', topic: Option.TOPIC_STATE } ]
)));
这会产生错误:
ERROR: 'Error from mock Http call for getOptions'
不产生错误的数据是:
connection.mockRespond(new Response(
new ResponseOptions({
body: { data: [ { id: 'NJ', name: 'New Jersey', topic: Option.TOPIC_STATE } ] }
)));
【问题讨论】:
标签: angular error-handling xmlhttprequest karma-jasmine observable