【问题标题】:I want to do a basic angular 2 unit test for a http get request我想为 http get 请求做一个基本的 angular 2 单元测试
【发布时间】:2017-04-19 18:11:48
【问题描述】:

我的技术: angular 版本 4、webpack、karma、jasmine 和 typescript 中的单元测试。

我想要一个基本示例,说明如何测试具有 http 调用的服务函数。

这是我的基本服务:

import {Injectable} from '@angular/core';
import {Http, Headers} from '@angular/http';

@Injectable()

export class TestService {
    headers: Headers;
    http: Http;

    constructor(http: Http) {
        this.http = http;
        this.headers = new Headers();
    }

    test = (): Promise<boolean> => {
        return new Promise((resolve, reject) => {
            const url = 'http://www.ipsumlorem.com/json';

            this.http.request(url).subscribe(response => {
                resolve(true);
            });
        });
    }
};

这是我目前的规范(单元测试):

import { TestService } from './test.service';

import {Injectable, ReflectiveInjector} from '@angular/core';
import {async, fakeAsync, tick, inject, TestBed} from '@angular/core/testing';
import {BaseRequestOptions, ConnectionBackend, Http, ResponseOptions, Response, HttpModule} from '@angular/http';
import {MockBackend, MockConnection} from '@angular/http/testing';

let service;

describe('Service : testService', () => {

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
          TestService,
          MockBackend,
          BaseRequestOptions,
          {
            provide: Http,
            deps: [MockBackend, BaseRequestOptions],
            useFactory: (mb:MockBackend, opts:BaseRequestOptions) => {
              return new Http(mb, opts);
            }
          }
      ],
      imports: [HttpModule]
      }).compileComponents();
  });

  beforeEach(inject([Http], (http: Http) => {
     service = new TestService(http);
  }));

  it('should call test function and return a promise with value true', async(() => {
      //Mock response
      TestBed.get(MockBackend).connections.subscribe(c => {
        c.mockRespond(new Response(new ResponseOptions({body: Promise.resolve(true)})));
      });

      let result = true;
      service.test().then((response: any) => result);
      expect(result).toEqual(true);
  }));

});

【问题讨论】:

标签: unit-testing angular


【解决方案1】:

工作示例:

import { TestService } from './test.service';

import {Injectable, ReflectiveInjector} from '@angular/core';
import {async, fakeAsync, tick, inject, TestBed} from '@angular/core/testing';
import {BaseRequestOptions, ConnectionBackend, Http, ResponseOptions, Response, HttpModule} from '@angular/http';
import {MockBackend, MockConnection} from '@angular/http/testing';

let service;

describe('Service : testService', () => {

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
          TestService,
          MockBackend,
          BaseRequestOptions,
          {
            provide: Http,
            deps: [MockBackend, BaseRequestOptions],
            useFactory: (mb:MockBackend, opts:BaseRequestOptions) => {
              return new Http(mb, opts);
            }
          }
      ],
      imports: [HttpModule]
      }).compileComponents();
  });

  beforeEach(inject([Http], (http: Http) => {
     service = new TestService(http);
  }));

  it('should call test function and return a promise with value true', async(() => {
      //Mock http call
      TestBed.get(MockBackend).connections.subscribe(c => {
        c.mockRespond(new Response(new ResponseOptions({body: Promise.resolve(true)})));
      });

      service.test().then((response: any) => {
        expect(response).toEqual(true);
      }); 
  }));    
});

【讨论】:

  • 可以添加导入吗?
  • 需要更多关于“不工作”的细节。另外,test 的返回类型应该是Observable,而不是Promise
  • 我只想模拟 http 并检查我的名为 test 的函数返回一个值为 true 的承诺。我已将我的单元测试更新为我当前的尝试。我目前得到的错误是:没有 Http 的提供者!
  • 编辑了我的答案。
猜你喜欢
  • 2021-12-19
  • 2016-04-03
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2017-11-23
  • 2017-07-06
相关资源
最近更新 更多