【问题标题】:Angular2 http call make tests execute twiceAngular2 http调用使测试执行两次
【发布时间】:2016-08-07 03:20:56
【问题描述】:

我有一个带有简单组件的 Angular2 应用程序

@Component({
  selector: 'Techs',
  template: '',
  providers: [HTTP_PROVIDERS]
})
export class Techs {
  public techs: Tech[];

  constructor(http: Http) {
    http
      .get('src/app/techs/techs.json')
      .map(response => response.json())
      .subscribe(result => this.techs = result);
  }
}

我的测试执行了两次:

Chrome 49.0.2623 (Mac OS X 10.11.4):执行 0 of 6 SUCCESS (0 secs / 0 secs)

LOG: '测试结束'

Chrome 49.0.2623 (Mac OS X 10.11.4):执行 6 次成功 6 次(0.182 秒 / 0.153 秒)

但是,如果我删除 Http 调用,测试只会执行一次

Chrome 49.0.2623 (Mac OS X 10.11.4):执行 6 次成功 6 次(0.182 秒 / 0.153 秒)

这是我的测试

describe('techs component', () => {
  it('should render 3 elements <tech>', injectAsync([TestComponentBuilder], (tcb: TestComponentBuilder) => {
    return tcb
      .createAsync(Techs)
      .then(fixture => {
        fixture.componentInstance.techs = [{}, {}, {}];
        fixture.detectChanges();
        const techs = fixture.nativeElement;
        expect(techs.querySelectorAll('tech').length).toBe(3);
      });
  }));
});

【问题讨论】:

    标签: javascript unit-testing typescript angular


    【解决方案1】:

    我认为您的问题来自 HTTP 调用的异步方面。我会看到两种方法来解决这个问题:

    • 另一种方法是模拟您的 Http 对象以模拟 HTTP 调用。这可以使用MockBackend 类来完成。

    这里是针对XHRBackend类配置它:

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

    以及在响应中返回您想要的内容的方法:

    it('Should return a list of dogs', inject([XHRBackend, HttpService, Injector], (mockBackend, httpService, injector) => {
      mockBackend.connections.subscribe(
        (connection: MockConnection) => {
          connection.mockRespond(new Response(
            new ResponseOptions({
              body: [ { name: 'test' }, ... ]
          })));
        }
        (...)
    

    【讨论】:

    • 谢谢。我已经尝试过模拟Http请求但还是一样...关于fakeAsync,我应该结合第一种方法(模拟Http后端)使用它吗?
    • 你可以尝试两者。 FakeAsync 允许您手动触发微任务。看到这个问题:stackoverflow.com/questions/35990253/…
    • 否则如何运行测试?
    • 我正在使用 Karma。问题是我不能使用fakeAsync,因为TestComponentBuilder.createAsync 是异步的并返回一个承诺......
    • 顺便说一句,我注意到如果我在方法initData() 中移动http 调用,然后,从我的测试中,我像Techs.prototype.initData = function(){...} 那样覆盖这个方法,那么它就可以工作(可能是因为不再进行异步 http 调用)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2022-09-24
    • 2022-12-09
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多