【问题标题】:Angular 2 AND Karma Test AND Async HTTPAngular 2 AND Karma 测试和异步 HTTP
【发布时间】:2016-01-26 20:12:03
【问题描述】:

所以我的问题很容易解释

这是我的测试规范

import {
  describe,
  expect,
  it,
  inject,
  beforeEachProviders
} from 'angular2/testing_internal';
import {RestClient} from './rest.service';
import 'rxjs/add/operator/toPromise';
import 'rxjs/add/operator/delay';
import {
  HTTP_PROVIDERS
} from 'angular2/http';
export function main() {
   describe('RestClient Service', () => {
      beforeEachProviders( () => [HTTP_PROVIDERS, RestClient] );
      it('is defined', inject( [RestClient], (client) =>{
         client.get('http://jsonplaceholder.typicode.com/posts/1')
         .delay(2000)
         .toPromise()
         .then((res) => {
            console.log('test');
            expect(res.length).toBeGreaterThan(1000);
         });
       }));
    });
  }

这是 "RestClient" 类中返回 Observable 的方法

public get(url:string): Observable<any> {
    return this.http.get(url).map(res => res.json());
}

所以,我开始测试,测试返回

START:
LOG: 'ciao'
RestClient Service
    ✔ is defined
PhantomJS 2.0.0 (Mac OS X 0.0.0) LOG: 'ciao'

Finished in 0.026 secs / 0.038 secs

SUMMARY:
   ✔ 2 tests completed

对于 Karma 来说,一切正常,测试正确通过并且不正确,同时如果我将 console.log 放入“then”,则永远不会被调用。 我想这是异步调用的问题,你知道如何在 Angular2 异步调用中进行测试吗 我也使用过 Inject 和 AsyncInject。 我知道我可以使用 MockBackend,但我需要使用外部 url 进行测试

提前感谢您的帮助

【问题讨论】:

  • 您想发布解决此问题的方法吗? @cingusoft

标签: http testing asynchronous angular karma-jasmine


【解决方案1】:

injectAsync 应该可以解决您的问题,但您需要返回承诺:

it('is defined', injectAsync( [RestClient], (client) =>{
  return client.get('http://jsonplaceholder.typicode.com/posts/1')
  .delay(2000)
  .toPromise()
  .then((res) => {
     console.log('test');
     expect(res.length).toBeGreaterThan(1000);
  });
}));

【讨论】:

  • 嗨@cexbrayat 谢谢你的回答,但我也测试了injectAsync 并且仍然失败。测试脚本不等待承诺,并且没有 $q 方法与 defer 允许“停止”进程,直到承诺完成循环。
  • 您使用的是哪个 Angular 版本?如果您使用的是最新版本(如 beta.0 或 beta.1),它应该等待承诺。
  • 版本是 beta.1 但我找到了解决方案 必须像这样注入 AsyncTestCompleter:it('is defined', injectAsync( [AsyncTestCompleter, RestClient], (async: AsyncTestCompleter, client: RestClient) =&gt; { client.get('http://jsonplaceholder.typicode.com/posts/1').then((res) =&gt; { console.log('ciaccia'); expect(res.length).toBeGreaterThan(3); async.done(); }); })); 但现在我遇到了 JASMINE TIMEOUT 的问题,我会调查
  • AsyncTestCompleter 可能不应该像在内部 API (AFAIK) 中那样使用。您可能在用例中遇到了一个错误,因为我已经使用了运行完美的 injectAsync 进行了数百次测试。也许您应该尝试在官方跟踪器上打开一个问题。
  • 官方测试API(公开的)是angular/testing
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
相关资源
最近更新 更多