Служба тестирования.TypeError: done.fail не является функцией - PullRequest
0 голосов
/ 31 мая 2018

Я попробовал этот тест, для тестирования моего сервиса:

Он показал эту ошибку:

TypeError: done.fail is not a function

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

 it('should return reasonable json ssss', inject([ProductService, MockBackend], async((service: ProductService, mockBackend: MockBackend) => {
       const mockResponse = {
            data: [
                { id: 0, details: 'All cats are lions' },
                { id: 1, details: 'Video 1' },
                { id: 2, details: 'Video 2' },
                { id: 3, details: 'Video 3' },
            ]
        };
        mockBackend.connections.subscribe(connection => {
            connection.mockRespond(new Response(
                new ResponseOptions({
                    body: [
                        { id: 0, details: 'All cats are lions' },
                        { id: 1, details: 'Video 1' },
                        { id: 2, details: 'Video 2' },
                        { id: 3, details: 'Video 3' },
                    ]
                })));
        });
        service.productsgetall().subscribe((facts) => {
            console.log(facts)
            expect(facts[0].details).toEqual('ffff');
        });
    })));

- Мой сервис.ts

public productsgetall(): Observable<Products[]> {
                ...
 return this.http.get(Api.getUrl(Api.URLS.productsgetall), {
      headers: headers
    }).map((response: Response) => {
        let res = response.json();
        if (res.StatusCode === 1) {
          this.auth.logout();
        } else {
          return res.StatusDescription.map(aa => {
            return new Products(aa);
          });
        }
  });
}

Можете ли вы сказать мне, в чем проблема в моем коде и как написать хорошее тестирование?Если это испытание не подходит, пожалуйста, предложите что-нибудь.

Спасибо.

Отредактируйте мой окончательный код.Ошибка:

Ошибка типа: done.fail не является функцией

it('should return reasonable json ssss', (done) => {
    inject([ProductService, MockBackend], async((service: ProductService, mockBackend: MockBackend) => {

        const mockResponse = {
            data: [
                { alarmnumber: 0, alarmdesc: 'All cats are lions' },
                { alarmnumber: 1, alarmdesc: 'Video 1' },
                { alarmnumber: 2, alarmdesc: 'Video 2' },
                { alarmnumber: 3, alarmdesc: 'Video 3' },
            ]
        };

        mockBackend.connections.subscribe(connection => {
            connection.mockRespond(new Response(
                new ResponseOptions({
                    body: [
                        { alarmnumber: 0, alarmdesc: 'All cats are lions' },
                        { alarmnumber: 1, alarmdesc: 'Video 1' },
                        { alarmnumber: 2, alarmdesc: 'Video 2' },
                        { alarmnumber: 3, alarmdesc: 'Video 3' },
                    ]
                })));
        });

        service.productsgetall().subscribe(facts=> {
            console.log(facts);
            console.log(facts[0]);
           // expect(facts.length).toEqual(300);
            expect(facts[0].alarmdesc).toEqual('ffff');
            done();
        },
        (error) => done.fail());
    }))();
});

ошибка изображения

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Просто сам столкнулся с подобной ситуацией, пытаясь протестировать простой сервис Angular 6, который требует http.Не уверен, в чем заключалась основная проблема, но я подозреваю, что это как-то связано с использованием async в сочетании с inject.Когда я реорганизовал тест, чтобы больше не использовать инжектирование, эта ошибка исчезла.

Обратите внимание, что в последних версиях Angular, если вы используете новый HttpClient, то используемый выше «MockBackend» был заменен на HttpTestingController.см. интересное введение в новый httpClient (включая тестирование) на medium.com здесь .

Учитывая ваш код выше, рефакторинг будет выглядеть примерно так:Очевидно, у меня нет ваших оригинальных сервисных данных для тестирования.:)

import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
describe('ProductService', () => {
    let httpMock: HttpTestingController;
    let service: ProductService;  
    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [HttpClientTestingModule],
            providers: [ProductService]
        });
        httpMock = TestBed.get(HttpTestingController);
        service = TestBed.get(ProductService);
    });
    it('should return reasonable json ssss', async(() => {
        const mockResponse = {
            data: [
                { alarmnumber: 0, alarmdesc: 'All cats are lions' },
                { alarmnumber: 1, alarmdesc: 'Video 1' },
                { alarmnumber: 2, alarmdesc: 'Video 2' },
                { alarmnumber: 3, alarmdesc: 'Video 3' },
            ]
        };
        service.productsgetall().subscribe(facts=> {
            console.log(facts);
            console.log(facts[0]);
            // expect(facts.length).toEqual(300);
            expect(facts[0].alarmdesc).toEqual('ffff');
        });
        let req = httpMock.expectOne('/your/test/url'); // <-- details not provided in your question
        expect(req.request.responseType).toEqual('json');
        req.flush(mockResponse); // send mockResponse back into the subscribe above
    }));
});
0 голосов
/ 31 мая 2018

У вас есть асинхронный тестовый пример, вы должны использовать параметр done, например:

it('should return reasonable json ssss', (done) => {

  inject([ProductService, MockBackend], async((service: ProductService, mockBackend: MockBackend) => {
    // your implementation

    service.productsgetall().subscribe((facts) => {
      console.log(facts)
      expect(facts[0].details).toEqual('ffff');

      done(); // <-- this will finish the test
    },
    (error) => done.fail());
  }))(); // <-- important, inject itself returns a function which needs to be called

}); 
...