【问题标题】:Angular2 error being processed through map, not catchAngular2错误正在通过map处理,而不是catch
【发布时间】: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”)。

所以我的问题:

  1. 如果 http get() 失败,它会返回一个好的 JSON 对象还是抛出一些东西?也许我没有期待正确的数据。

  2. 不应该调用错误函数(.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


    【解决方案1】:

    您只需要使用connection.mockError(yourError)。

    更新。

    回答您的特定问题。

    1) 由于 Angular http 服务通过 Observables 运行,它使用它们的机制来传递结果:成功的结果将发送到 subscribe() 中的 onNext() 处理程序,而错误的结果将发送到 onError() 处理程序。查看您的代码,我想说的是,除了特定值之外,您对它应该如何工作的期望通常是正确的——它们可能与您的期望不同,但至少它们会到达正确的位置,并且它们将包含类似于你期待。

    2) 是的,应该。您必须更改的内容在此答案中。

    【讨论】:

    • 虽然这个答案可能是正确的,但最好解释一下它为什么会起作用,因为其他人将来可能会看到这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2016-08-06
    • 1970-01-01
    • 2013-01-21
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多