Jasmine单元测试,只覆盖服务中的属性



这是我的组件规范文件。它使用CalendarService。在CalendarService内部有weekNames,monthNames,monthLongNames属性(它们只是字符串数组)。现在…CalendarService里面有很多方法。我希望能够在我的规范文件中只覆盖这3个属性,但保留其余的方法并在规范文件中使用它们。我想要重写它们的原因是因为它们使用了另一个要创建的服务(例如。weekNames = [this.translationService.formatMessage(),…],……,……)。这使得测试变得非常困难,因为组件中有一个内部有服务的服务。

编辑:或者另一种解决方案是用mockservice覆盖translationservice。然而translationservice位于CalendarService中,它使用我的组件。所以我不知道怎么做。

describe('FCCalendarComponent', () => {
let component: CalendarWrapperComponent;
let fixture: ComponentFixture<CalendarWrapperComponent>;
let calendarComponent: FCCalendarComponent;
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [
FCCalendarComponent,
CalendarWrapperComponent
],
imports: [
BrowserModule,
FormsModule,
ReactiveFormsModule,
FCBaseModule,
HttpClientModule,
FCTranslateModule,
FCCalendarModule
],
providers: [
FCTranslateLoader,
CalendarService,
FCTranslationService,
{
provider: CalendarService, useValue: {
weekNames: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
monthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
monthLongNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
}
},
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(CalendarWrapperComponent);
component = fixture.componentInstance;
calendarComponent = fixture.debugElement.children[0].componentInstance;
fixture.detectChanges();
})

it('should create component', () => {
expect(component).toBeTruthy();
});
});

@Component({
selector: 'calendar-wrapper',
template: `
<fc-calendar value="2001.02.02" 
minDate="2000.03.03" 
maxDate="2002.04.04">
</fc-calendar>
`
})
export class CalendarWrapperComponent {
}

重写三个属性(如您所示)或模拟翻译服务都是合法的解决方案。

翻译服务未"定位";在日历服务内部,但注入其中。因此,为了模拟它,您需要使用提供+useValue机制,就像您对三个属性所做的那样(也许您必须创建translationMockService类并调用useClass而不是useValue)。

解决方案:如果你的组件中有一个服务,而该服务内部使用了另一个服务。你可以模仿"子"服务,而不是模仿"父"服务。只需将'子'服务添加到提供商中,如下所示

FCTranslationService,
{
provider: FCTranslationService, useValue: { }
},

和在beforEach中使用模拟服务重写它,如下所示

TestBed.overrideProvider(FCTranslationService, { useValue: new TranslateMockService() })

如果你想知道mock是什么样子的

export class TranslateMockService {
formatMessage() {
return;
}
}

mock只有父服务正在使用的方法,没有其他。

最新更新