【问题标题】:angular2 testing framework async testing issueangular2 测试框架异步测试问题
【发布时间】:2016-10-31 11:53:14
【问题描述】:

我已经使用 angular-cli 创建了 angular 2 项目和服务,并尝试测试我的服务。

但 API 不会在异步函数中失败,尽管它应该失败;而且,它只是忽略了那些异常。

/* tslint:disable:no-unused-variable */

import {
  beforeEach, beforeEachProviders, describe, xdescribe,
  expect, it, xit, async, inject, injectAsync
} from '@angular/core/testing';
import { SearchService } from './search.service';
import {provide} from '@angular/core';
import {MockBackend, MockConnection} from '@angular/http/testing';
import {XHRBackend, Response, ResponseOptions, HTTP_PROVIDERS} from '@angular/http';

describe('Search Service', () => {
  let searchService: SearchService;
  let mockBackend: MockBackend;

  beforeEachProviders(() => [
    HTTP_PROVIDERS,
    MockBackend,
    provide(XHRBackend, { useClass: MockBackend }),
    SearchService
  ]);

  beforeEach(injectAsync([SearchService, MockBackend], (s, m) => {
    searchService = s;
    mockBackend = m;
  }));

  it('async test', () => {
    setTimeout(() => {
      expect(2).toBe(1);
    }, 3000);
  });

它只是忽略了那些最小的测试用例。

然后我阅读了一些文档并更新了我的代码如下。

it('async test with done', (done) => {
  setTimeout(() => {
    expect(1).toBe(1);
    done();
  }, 1000);
});

但这一次,测试失败了,虽然它应该通过。错误如下。

错误:超时 - 在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时内未调用异步回调。

我将默认超时值更改为更大的值,但没有效果。

【问题讨论】:

  • 你使用的是哪个 Angular2 版本?
  • 它的版本是2.0.0-rc.3

标签: unit-testing asynchronous angular karma-jasmine


【解决方案1】:

injectAsync 不起作用,使用 async(在 rc2 后停止为我工作)

angular2 change log beta 16

injectAsync 现在已弃用。相反,使用 async 函数来包装任何异步测试。 您还需要将依赖项“node_modules/zone.js/dist/async-test.js”作为服务文件添加到您的 Karma 或其他测试配置中。

之前:

it('should wait for returned promises', injectAsync([FancyService], (service) => {
  return service.getAsyncValue().then((value) => { expect(value).toEqual('async value'); });
}));
it('should wait for returned promises', injectAsync([], () => {
  return somePromise.then(() => { expect(true).toEqual(true); });
}));

之后:

it('should wait for returned promises', async(inject([FancyService], (service) => {
  service.getAsyncValue().then((value) => { expect(value).toEqual('async value'); });
})));
// Note that if there is no injection, we no longer need `inject` OR `injectAsync`.
it('should wait for returned promises', async(() => {
  somePromise.then(() => { expect(true).toEqual(true); });
}));

【讨论】:

  • 你能通过问题的更新来更新答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多