[英]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.