Тестирование угловых 6 обещаний инъекций - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь сделать тест в угловых, но у меня есть некоторые проблемы.у меня есть код ниже:

//LojasService code:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http'; 
import { Lojas } from './lojas';

@Injectable()
export class LojasServices{

constructor(private http : HttpClient){

}

todasLojas(): Promise<Lojas[]>{

    return new Promise((resolve,reject) => {

        this.http.get<Lojas[]>('http://localhost:3000/todasLojas')
        .subscribe(
            (s: Lojas[]) => resolve(s),
            (err) =>  reject(err)
        );

    });

}}
  //here is the test class
describe('Lojas Services', () => {

  beforeEach(() => {

    TestBed.configureTestingModule({
        imports: [HttpClientTestingModule],
        providers: [LojasServices]
    });

});

it('should return a the correct value', inject([LojasServices], (service: LojasServices)=>{

 service.todasLojas().then(a => {
    console.log('loggin');
    expect(a.length).toBe(3);
  }).catch(s => {
    expect(true).toBe(false);
  });

 }));

Я вижу другие решения в Интернете, но я не могу найти их полезными.Попытка использовать «асинхронный» перед инъекцией, но все равно это не помогло.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Я вижу две основные проблемы с вашим кодом как есть:

  • Хотя вы не вызываете внутреннюю службу, так как импортируете HttpClientTestingModule, вы на самом деле не настраиваете еев любом месте.Для этого имеется обширная документация: Тестирование HTTP-запросов .Однако, чтобы протестировать такой простой сервис, я бы не стал вдаваться во все эти неприятности, метод get() довольно просто подделать.в вашей спецификации (функция 'it').Это решается путем переноса обратного вызова на async.

У меня это работает в Stackblitz для вас.

Из этого Stackblitz, вот.spec's describe():

describe('Lojas Services', () => {
    const mockReturnValue: Lojas[] = [1, 2, 3]; // change this!
    const httpSpy = jasmine.createSpyObj('HttpClient', ['get']);
    httpSpy.get.and.returnValue(of(mockReturnValue));

    beforeEach(() => {
        TestBed.configureTestingModule({
            // imports: [ HttpClientTestingModule ], <-- this is commented out
            providers: [ LojasServices, 
                {provide: HttpClient, useValue: httpSpy} // <-- this uses the spy instead of HttpClient
            ]
        });
    });

    it('should return the correct value', async(inject([LojasServices], (service: LojasServices)=>{
        service.todasLojas()
            .then(a => {
                console.log('loggin');
                expect(a.length).toBe(3);
            })
            .catch(s => {
                expect(true).toBe(false);
            });
    })));
});

Да, я изменил ваши отступы - это чисто личное предпочтение.:)

0 голосов
/ 07 декабря 2018

Вы можете попробовать это:

import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { TestBed } from '@angular/core/testing';

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

describe('Lojas Services', () => {
    let service: LojasServices;
    let httpTestingController: HttpTestingController;


    beforeEach(() => {

        TestBed.configureTestingModule({
            imports: [HttpClientTestingModule],
            providers: [LojasServices]
        });

        service = TestBed.get(LojasServices);
        httpTestingController= TestBed.get(HttpTestingController);

    });

    afterEach(() => {
        // After every test, assert that there are no more pending requests.
        httpTestingController.verify();
    });

    it('should be created', () => {
        expect(service).toBeTruthy();
    });

    it('should return a the correct value',() => {
        service.todasLojas().then( a => {
            expect(a.length).toBe(3);
        }, err => {
            expect(err).toBeTruthy();
        });
    });

});
...