Ответ со статусом: null null для URL: null ошибка при тестировании почтового сервиса http

Тестирование почтового сервиса http. Но тест завершается со следующей ошибкой Ожидается, что объект будет своего рода объектом, но был ответ со статусом: null null для URL: null.

Я попытался добавить URL-адрес в RequestOptions, но это дало ошибку. в чем может быть проблема не могу понять

// тестовый файл

import { async, ComponentFixture, TestBed, getTestBed, inject } from '@angular/core/testing';
import { MockBackend, MockConnection } from '@angular/http/testing';
import { HttpPostService } from './http-post.service';
import {
  BaseRequestOptions, Http, XHRBackend, HttpModule,
  Response, ResponseOptions, RequestMethod
} from '@angular/http';
import { ICourseModel } from '../interface/course-model';

describe('HttpPostService', () => {
  let mockBackend: MockBackend;


  beforeEach(async(() => {
    TestBed.configureTestingModule({
      providers: [
        HttpPostService,
        MockBackend,
        BaseRequestOptions,
        {
          provide: Http,
          deps: [MockBackend, BaseRequestOptions],
          useFactory:
          (backend: XHRBackend, defaultOptions: BaseRequestOptions) => {
            return new Http(backend, defaultOptions);
          }
        }
      ],
      imports: [
        HttpModule
      ]
    });
    mockBackend = getTestBed().get(MockBackend);
  }));

  it('should insert new courseList',
    async(inject([HttpPostService], (service: HttpPostService) => {
      mockBackend.connections.subscribe((connection: MockConnection) => {
        expect(connection.request.method).toBe(RequestMethod.Post);
        connection.mockRespond(new Response(new ResponseOptions({})));
        const contentType = connection.request.headers.get('Content-Type');
        expect(contentType).not.toBeNull();
        expect(contentType).toEqual('application/json');
        expect(connection.request.url).toBe('someurl/data.json');
      });
      const courseList: ICourseModel[] = [
        { 'course': 'Mobile Development' },
        { 'course': 'Web Development' },
        { 'course': 'IOS Development' },
        { 'course': 'Android Development' }
      ];
      const result = service.storeData(courseList);
      result.subscribe(
        (successResult) => {
          expect(successResult).toBeDefined();
          expect(successResult).toEqual({});
        });
    })));
});

// http почтовый сервис

import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import { ICourseModel } from '../interface/course-model';
import { Observable } from 'rxjs/Observable';

// HTTP Post service to post the data to the server. Add Content-type in the header while posting a data
@Injectable()
export class HttpPostService {

  constructor(private http: Http) { }

  storeData(crs: ICourseModel[]) {
    const headers = new Headers({'Content-Type': 'application/json'});
    headers.append('Accept', 'application/json');
    return this.http.post('someurl/data.json', crs, {headers: headers}).catch(
      (error: Response) => {
        return Observable.throw(error);
      }
    );
  }
}

person SONGSTER    schedule 23.10.2017    source источник


Ответы (1)


Мне кажется, вы слишком все усложняете. Не проверяйте, работает ли http.post (это сделала команда angular); проверьте, правильно ли ваша служба вызывает http.post. Этого должно быть достаточно для вашего сервиса:

describe('HttpPostService', () => {
  let service: HttpPostService;
  let http;
  const testError = new Error('Test Error');
  const courseList: ICourseModel[] = [
    { 'course': 'Mobile Development' },
    { 'course': 'Web Development' },
    { 'course': 'IOS Development' },
    { 'course': 'Android Development' }
  ];

  beforeEach(() => {
    http = jasmine.createSpyObject('http', ['post']);
    service = new HttpPostService(http);
  });

  it('should work', () => {
    service.storeData(courseList);
    expect(http.post
      .toHaveBeenCalledWith('someurl/data.json', courseList, jasmine.any(Object));
  });

  it('should throw', () => {
    http.post.and.returnValue(Observable.throw(testError));
    // since you're not handling error in HttpPostService, 
    // you don't need to test catch(), 
    // but if there was a HttpPostService.errorHanlder test would be:
    spyOn(service, 'errorHandler');
    service.storeData(courseList);
    expect(service.errorHandler).toHaveBeenCalledWith(testError);
  });
});

Вы можете узнать больше о жасминовых шпионах.

person Sasxa    schedule 23.10.2017
comment
Я не хочу, но это мое задание, поэтому я должен. Не могли бы вы ответить с моим кодом. Спасибо за вашу помощь - person SONGSTER; 23.10.2017
comment
Тогда предлагаю взглянуть на официальные тесты и их настройку: https://github.com/angular/angular/blob/master/packages/http/test/http_spec.ts - person Sasxa; 23.10.2017
comment
и у меня есть еще один вопрос, как вы проверяете «тип содержимого» ответа в тестах - person SONGSTER; 23.10.2017