问题描述
在我的单元测试中,我能够设置参数(或至少是快照),但我想重新触发 subscribe 方法内的回调并断言一些期望。我不确定如何在订阅方法中重新触发回调。
这是我的组件的相关代码:
@Component({
...
})
export class MyComponent implements OnInit {
quarter: number;
year: number;
paramQuarter: string;
selectedQuarter: IQuarter;
quartersList: IQuarter[];
constructor(
private quarterService: QuarterService,private activatedRoute: ActivatedRoute,private router : Router) {
// if no query param is set,set as the current quarter and year from moment.js
this.paramQuarter = this.activatedRoute.snapshot.queryParams['quarter']
|| moment().quarter() + '-' + moment().year();
}
ngOnInit(): void {
this.quarterService.getQuarters().subscribe(response => {
this.quartersList = response;
/// ----------------------------------
/// The code I want to test is in here
/// ----------------------------------
const [quarter,year] = this.paramQuarter.split("-").map(string => parseInt(string));
// get the correct quarter based on URL params,or the current one if the url param is malformed
this.selectedQuarter: IQuarter = this.quartersList
.filter(q => q.quarter === quarter && q.year === year)[0]
|| this.quartersList[0];
});
}
}
以及测试:
const MOCK_QUARTERS = [
{
quarter: 2,year: 2020,startDate: '2020-04-01',endDate: '2020-06-30',},{
quarter: 1,startDate: '2020-01-01',endDate: '2020-03-31',}
]
describe('MyComponent',() => {
let component: MyComponent;
let fixture: ComponentFixture<MyComponent>;
let quarterService: QuarterService;
let router : Router;
let activatedRoute : ActivatedRoute;
const MockQuarterService = {
getQuarters: jasmine.createSpy('getQuarters').and.returnValue(
of(MOCK_QUARTERS)
)
}
beforeEach(async(() => {
Testbed.configureTestingModule({
declarations: [
MyComponent,],imports: [
SharedModule,RouterTestingModule,...HttpClientTestingImports,providers: [
...HttpClientTestingProviders,{ provide: QuarterService,useValue: MockQuarterService },{
provide: ActivatedRoute,useValue: {
queryParams: of({ quarter: '2-2020' }),snapshot: {
queryParams: { quarter: '2-2020' }
}
}
},]
})
.compileComponents();
}));
beforeEach(() => {
fixture = Testbed.createComponent(MyComponent);
component = fixture.componentInstance;
quarterService = Testbed.inject(QuarterService);
router = Testbed.inject(Router);
activatedRoute = Testbed.inject(ActivatedRoute);
fixture.detectChanges();
});
fit('should set the current quarter from correctly formed URL params',async(() => {
// set from the params in the beforeEach callback
expect(component.selectedQuarter).toEqual(MOCK_QUARTERS[0]);
spyOn(component,'updateQuarterSelection').and.callThrough();
let actRoute : ActivatedRoute = fixture.debugElement.injector.get(ActivatedRoute);
actRoute.queryParams = of( {quarter: `${MOCK_QUARTERS[1].quarter}-${MOCK_QUARTERS[1].year}` } );
actRoute.snapshot.queryParams.quarter = `${MOCK_QUARTERS[1].quarter}-${MOCK_QUARTERS[1].year}`;
/// ----------------------------------
// Somehow need the callback of the quarterService.getQuarters().subscribe()
// method to retrigger here
/// ----------------------------------
fixture.detectChanges();
console.log(component);
expect(quarterService.getQuarters).toHaveBeenCalledTimes(2);
expect(component.updateQuarterSelection).toHaveBeenCalledTimes(2);
expect(component.selectedQuarter).toEqual(MOCK_QUARTERS[1]);
}));
});
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)