我正在写一个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时(选项=未定义)并且我得到了相同的错误("'未定义'没有' id'属性")。
所以我的问题:
如果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 } ] }
)));
答案 0 :(得分:0)
您只需使用connection.mockError(yourError)
。
更新。
回答您的具体问题。
1)由于角度http服务通过Observables运行,因此它使用它们的机制来提供结果:成功的结果将转到subscribe()中的onNext()处理程序,而错误的结果将转到onError()处理程序。看看你的代码,我说一般来说你对它应该如何运作的期望是正确的,除了特定的价值 - 它们可能与你的期望不同但至少它们会去正确的地方并且它们将包含类似的东西达到你的期望。
2)是的,它应该。你需要改变的是上面的答案。