如何解决在Jasmine中使用2种不同的模拟进行测试
我有这样的ts后卫:
@Injectable({
providedIn: 'root'
})
export class AppEssentialsGuard implements CanActivate {
private readonly DEFAULT_APP_ID = 'def';
constructor(private appsService: AppsService) {}
canActivate(next: ActivatedRouteSnapshot,state: RouterStateSnapshot): boolean {
const url = this.getDefaultAppUrl();
if (url) {
window.open(url);
}
return false;
}
private getDefaultAppUrl(): string {
const myApp = this.appsService.getAllApps()
.find(app => app.appId === this.DEFAULT_APP_ID);
return myApp ? myApp.url : null;
}
}
我正在为此编写测试,如下所示:
describe('AppEssentialsGuard',() => {
let guard: AppEssentialsGuard;
let appsService: AppsService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
mockProvider(RequesterService),{provide: AppsService,useClass: AppsServiceMock}
]
});
appsService = TestBed.inject(AppsService);
guard = TestBed.inject(AppEssentialsGuard);
});
it('should be created',() => {
expect(guard).toBeTruthy();
});
it( 'should open new default app window',() => {
spyOn(window,'open');
let returnValue = guard.canActivate(null,null);
expect( window.open ).toHaveBeenCalledWith("https://appstore.com/");
expect(returnValue).toBeFalsy();
});
});
现在进行快乐流测试,我正在使用useClass中指定的AppsServiceMock,它返回一组虚拟应用程序,包括一个ID为'def'的虚拟应用程序。
我的问题是,我还想测试该URL返回一个空数组的情况,或者一个没有'def'应用程序的情况,如何测试这两种情况?我不知道如何使用另一个模拟
我是茉莉花的新手
谢谢!
解决方法
您可以通过监视getAllApps
并在声明之前返回一个值来实现所需的行为。监视并返回值将忽略原始的细节实现,并将始终返回您指定的值。
// happy path;
it( 'should open new default app window',() => {
spyOn(appService,'getAllApps').and.returnValue([/* add an array of elements you would like */]);
spyOn(window,'open');
let returnValue = guard.canActivate(null,null);
expect( window.open ).toHaveBeenCalledWith("https://appstore.com/");
expect(returnValue).toBeFalsy();
});
// empty array path
it( 'should not open new default app window','getAllApps').and.returnValue([]);
spyOn(window,null);
expect( window.open ).not.toHaveBeenCalled(); // change your assertion here
expect(returnValue).toBeFalsy();
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。