Angular 8 - 抽象服务的单元测试
Angular 8 - Unit test for abstract service
我应该为抽象服务编写单元测试。我们在应用程序中有几个 SSE 通道,我们创建了要扩展的基本 SSE 服务,它提供了一些基本功能。
export abstract class BaseSseService {
protected zone: NgZone;
protected sseChannelUrl: string;
private eventSource: EventSource;
private reconnectFrequencySec: number = 1;
private reconnectTimeout: any;
constructor(channelUrl: string) {
const injector = AppInjector.getInjector();
this.zone = injector.get(NgZone);
this.sseChannelUrl = channelUrl;
}
protected abstract openSseChannel(): void;
//...
}
现在,在它被抽象化之前,单元测试被运行ning。一旦我将其更改为摘要 class,我在尝试 运行 should be created
测试时遇到此错误:Error: Can't resolve all parameters for TestBaseSseService: (?).
我的测试是这样的:
class TestBaseSseService extends BaseSseService {
openSseChannel() {
console.log('Test');
}
}
fdescribe('BaseSseService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
TestBaseSseService,
Injector,
{ provide: String, useValue: "test" }
]
});
AppInjector.setInjector(TestBed.get(Injector));
})
describe(':', () => {
function setup() {
return TestBed.get(TestBaseSseService)
}
it('should be created', () => {
const service = setup();
expect(service).toBeTruthy();
});
});
});
问题是,我是否应该为抽象服务进行单元测试?如果是,如何解决这个问题?如您所见,模拟服务并不能解决这个问题,也不能将 BaseSseService
添加到 TestBed
提供者。
它试图从抽象 class 中提供 channelUrl
,但这显然不是提供者或 InjectionToken。
您可以更改您的服务来处理此问题:
class TestBaseSseService extends BaseSseService {
constructor() {
super('url');
}
openSseChannel() {
console.log('Test');
}
}
是的,测试摘要总是好的 class。这样你就可以确定无论何时你实施它,它都会表现得一样(当测试正确时)
我应该为抽象服务编写单元测试。我们在应用程序中有几个 SSE 通道,我们创建了要扩展的基本 SSE 服务,它提供了一些基本功能。
export abstract class BaseSseService {
protected zone: NgZone;
protected sseChannelUrl: string;
private eventSource: EventSource;
private reconnectFrequencySec: number = 1;
private reconnectTimeout: any;
constructor(channelUrl: string) {
const injector = AppInjector.getInjector();
this.zone = injector.get(NgZone);
this.sseChannelUrl = channelUrl;
}
protected abstract openSseChannel(): void;
//...
}
现在,在它被抽象化之前,单元测试被运行ning。一旦我将其更改为摘要 class,我在尝试 运行 should be created
测试时遇到此错误:Error: Can't resolve all parameters for TestBaseSseService: (?).
我的测试是这样的:
class TestBaseSseService extends BaseSseService {
openSseChannel() {
console.log('Test');
}
}
fdescribe('BaseSseService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
TestBaseSseService,
Injector,
{ provide: String, useValue: "test" }
]
});
AppInjector.setInjector(TestBed.get(Injector));
})
describe(':', () => {
function setup() {
return TestBed.get(TestBaseSseService)
}
it('should be created', () => {
const service = setup();
expect(service).toBeTruthy();
});
});
});
问题是,我是否应该为抽象服务进行单元测试?如果是,如何解决这个问题?如您所见,模拟服务并不能解决这个问题,也不能将 BaseSseService
添加到 TestBed
提供者。
它试图从抽象 class 中提供 channelUrl
,但这显然不是提供者或 InjectionToken。
您可以更改您的服务来处理此问题:
class TestBaseSseService extends BaseSseService {
constructor() {
super('url');
}
openSseChannel() {
console.log('Test');
}
}
是的,测试摘要总是好的 class。这样你就可以确定无论何时你实施它,它都会表现得一样(当测试正确时)