Angular 4写入测试正确用于父路由订阅

时间:2017-08-29 15:23:36

标签: angular unit-testing

我试图在unit test中写Angular 4.3.6

我已经查看了以下参考资料:

  1. how can i create MockActivatedRoute for the parent routes of ActivatedRoute in angular 4 Unit testing

  2. How to mock an activatedRoute parent Route in angular2 for testing purposes?

  3. Testing Angular 2 parent route

  4. 事情是 - 我不认为(我可能完全错了)我应该在这种情况下模仿ActivatedRoute,例如:

    我有一个子组件,它与父激活的路由有subscribe,如下所示:

    // children.component.ts
    ngOnInit() {
      this.activatedRoute.parent.paramMap
        .map(m => m.get("contractId"))
        .distinctUntilChanged()
        .subscribe(contractId => {
          console.log(contractId);
      });
    }
    

    现在我想写下面的测试:

    should call the parent subscription when contractId changes

    我认为是这样的:

    it("should call the parent subscription when contractId changes", fakeAsync(() => {
      // Initializes route with contractId 1000
      router.navigate(["1000", "Parent", "Children"]);
    
      tick();
    
      fixture.detectChanges(); // this calls ngOnInit
    
      // changes the contractId to 2000
      router.navigate(["2000", "Parent", "Children"]);
    
      tick();
    
      expect(component.contractId).toBe("2000");
    }));
    

    我收到以下错误:

      

    TypeError:无法读取属性' paramMap'为null

    我为此发布了一个关于此事的人:https://plnkr.co/edit/2SXzvSDe3OiwvvRJYXfN?p=preview

    请注意,在plunker中我写了两个测试。第一个运行正常,所以路由器正在运行。

    如何在单元测试中观察路线的变化以及为什么parent为空?

    修改

    我使用基于ActivatedRouteStub的模拟ActivatedRoute更新了我的plunker。然后我现在得到以下错误:

      

    TypeError:无法读取属性' paramMap'未定义的

    这可能是因为存根没有定义父级,因此它未定义。

    我可以在模拟中定义一个parent属性,但这是正确的吗?

0 个答案:

没有答案