茉莉角4单元测试router.url

时间:2018-11-15 07:14:43

标签: angular unit-testing karma-jasmine router

我正在使用茉莉花(如下文所述的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为'/'。任何建议或解决方案都将受到欢迎。

2 个答案:

答案 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 在这篇文章中的回答:

https://stackoverflow.com/a/63623284/1774291