我正在使用茉莉花(如下文所述的switch语句)对angular 4项目中的功能进行单元测试:
switch(this.router.url) {
case 'firstpath': {
// some code
}
break;
case 'secondpath': {
// some more code
}
break;
default:
break;
}
在我的spec.ts文件中。我无法存根或更改router.url的值。我希望执行我的案件,但默认情况下正在执行。我尝试了不同的方法来设置或spyOn并返回值,但是每次url为'/'。任何建议或解决方案都将受到欢迎。
答案 0 :(得分:6)
首先,您需要在测试模块中模拟路由器:
TestBed.configureTestingModule({
...
providers: [
{
provide: Router,
useValue: {
url: '/path'
} // you could use also jasmine.createSpyObj() for methods
}
]
});
您还可以在测试中更改URL并运行您的测试方法:
const router = TestBed.get(Router);
router.url = '/path/to/anything';
// now you can run your tested method:
component.testedFunction();
您提到spyOn
无效,因为它仅适用于方法/函数。但是url
是一个属性。
答案 1 :(得分:2)
对于使用 Angular 9 及以上版本的人,url 现在是只读属性,因此 spyOnProperty 将不起作用。这也很令人困惑,因为您不会收到错误消息,但也不会看到任何“间谍”。
要解决这个问题,请使用以下代码:
const mockUrlTree = routerSpy.parseUrl('/mynewpath/myattribute');
// @ts-ignore: force this private property value for testing.
routerSpy.currentUrlTree = mockUrlTree;
感谢 Rob 在这篇文章中的回答: