繁体   English   中英

在管道单元测试中进行模拟时服务未定义

[英]Service undefined when mocking inside Pipe unit test

我正在尝试在Pipe的单元测试中模拟服务。 我面临的问题是,即使遵循多种指南并使用了许多方法,我仍然会遇到TypeError: Cannot read property 'transformDateToApi' of undefined执行测试时TypeError: Cannot read property 'transformDateToApi' of undefined错误的TypeError: Cannot read property 'transformDateToApi' of undefined

我见过其他人在组件上执行此任务,但是对于Pipe,它略有不同,对吗?

date.pipe.spec.ts

import { TestBed } from '@angular/core/testing';
import { DatePipe } from './date.pipe';
import { DateFormat } from '@app/enums';
import { ApiService } from '@app/services';
import { MainService } from '@app/state';

class MockApiService extends ApiService {
    transformDateToApi(date: Date = new Date()): string {
        return '13-08-1996T22:10:32';
    }
}

describe('DatePipe', () => {
    const testDate = new Date('13-08-1996T22:10:32');
    const testDateAsString = '13-08-1996 22:10:32';

    const pipe = new DatePipe();
    let apiService: ApiService;

    beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [
                { provide: ApiService, useClass: MockApiService },
                { provide: MainService, useValue: {} }
            ]
        });
        apiService = TestBed.get(ApiService);
    });

    // Date object test
    it('date (as Date object) will be properly transformed in DateFormat.Xshort format', () => {
        expect(pipe.transform(testDate, DateFormat.Xshort)).toBe('13-08-\'96');
    });
    it('date (as Date object) will be properly transformed in DateFormat.Short format', () => {
        expect(pipe.transform(testDate, DateFormat.Short)).toBe('13-08-1996');
    });
    it('date (as Date object) will be properly transformed in DateFormat.Pretty format', () => {
        expect(pipe.transform(testDate, DateFormat.Pretty)).toBe('13 augustus 1996');
    });
    it('date (as Date object) will be properly transformed in DateFormat.WithTime format', () => {
        expect(pipe.transform(testDate, DateFormat.WithTime)).toBe('13 augustus 1996 22:10:32');
    });
});

date.pipe.ts

import { Pipe, PipeTransform } from '@angular/core';
import { ApiService } from '@app/services';
import { DateFormat } from '@app/enums';
import { DateSegments } from '@app/interfaces';

@Pipe({
    name: 'formatDate'
})
export class DatePipe implements PipeTransform {
    private date: DateSegments;

    constructor (
        private apiService: ApiService
    ) { }

    transform(date: Date | string, format: DateFormat = DateFormat.Pretty): string {
        if ( date instanceof Date ) {
            console.log(this.apiService);
            console.log(ApiService);
            date = this.apiService.transformDateToApi(date);
        }

..... (irrelevant code to this question)

我收到的错误是TypeError: Cannot read property 'transformDateToApi' of undefined

至此,我的反复试验策略已被重新带到一起粉碎代码,这种策略对我没有任何帮助。

你这样做是错的。

管道非常简单,您不应使用测试台对其进行测试。 而是模拟您的服务,并通过注入服务来简单地创建它。 这样的事情。

import { TestBed } from '@angular/core/testing';
import { DatePipe } from './date.pipe';
import { DateFormat } from '@app/enums';
import { ApiService } from '@app/services';
import { MainService } from '@app/state';

const apiServiceMock = {
  transformDateToApi(date: Date = new Date()): string {
    return '13-08-1996T22:10:32';
  }
};

describe('DatePipe', () => {
  const testDate = new Date('13-08-1996T22:10:32');
  const testDateAsString = '13-08-1996 22:10:32';

  let pipe: DatePipe;
  let apiService: ApiService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        { provide: ApiService, useValue: apiServiceMock },
        { provide: MainService, useValue: {} }
      ]
    });
    apiService = TestBed.get(ApiService);
  });

  beforeEach(() => {
    pipe = new DatePipe(apiServiceMock as any);
  });

  // Date object test
  it('date (as Date object) will be properly transformed in DateFormat.Xshort format', () => {
    expect(pipe.transform(testDate, DateFormat.Xshort)).toBe('13-08-\'96');
  });
  it('date (as Date object) will be properly transformed in DateFormat.Short format', () => {
    expect(pipe.transform(testDate, DateFormat.Short)).toBe('13-08-1996');
  });
  it('date (as Date object) will be properly transformed in DateFormat.Pretty format', () => {
    expect(pipe.transform(testDate, DateFormat.Pretty)).toBe('13 augustus 1996');
  });
  it('date (as Date object) will be properly transformed in DateFormat.WithTime format', () => {
    expect(pipe.transform(testDate, DateFormat.WithTime)).toBe('13 augustus 1996 22:10:32');
  });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM