📜  this.router.getcurrentnavigation 不是功能单元测试 (1)

📅  最后修改于: 2023-12-03 15:20:37.504000             🧑  作者: Mango

关于this.router.getCurrentNavigation()不是功能单元测试的介绍

什么是this.router.getCurrentNavigation()?

this.router.getCurrentNavigation()是一个Angular路由器(Router)提供的方法,用于获取当前正在激活的路由导航对象(Navigation对象),其返回值是一个Observa‌ble对象。使用该方法,我们可以获取当前导航的相关信息,如路由参数、查询参数等。

为什么this.router.getCurrentNavigation()不适合进行功能单元测试?

虽然this.router.getCurrentNavigation()方法非常有用,但由于其返回值为Observable对象,而在进行功能单元测试时,我们需要测试的是被测试部分的返回值是否与预期相符。而Observable对象的值旨在异步获取,这增加了功能单元测试的复杂性。因此,使用此方法进行单元测试可能不是最佳实践。

如何避免使用this.router.getCurrentNavigation()进行功能单元测试?

我们可以通过模拟路由导航对象(Navigation)来代替this.router.getCurrentNavigation()方法。这可以通过使用测试桩(Test Stubs)或桩类(Test Spies)来实现。我们可以自己编写一个模拟Navigation对象,使其返回我们需要的值,并将其注入到被测试的组件或服务中,以在单元测试中使用。

以下是一个例子,展示了如何使用测试桩模拟Navigation对象:

class NavigationStub {
    public getCurrentUrl(): string {
        return '/test';
    }

    public getQueryParam(param: string): string {
        return 'testQueryParam';
    }

    public getParam(param: string): string {
        return 'testParam';
    }
}

describe('AppComponent', () => {
    let appComponent: AppComponent;
    let fixture: ComponentFixture<AppComponent>;

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [AppComponent],
            providers: [
                { provide: Router, useClass: RouterStub }
            ]
        }).compileComponents();
    }));

    beforeEach(() => {
        fixture = TestBed.createComponent(AppComponent);
        appComponent = fixture.componentInstance;
        fixture.detectChanges();
    });

    it('should use the NavigationStub', () => {
        spyOn(appComponent.router, 'getCurrentNavigation').and.returnValue(of(new NavigationStub()));
        // perform your tests here
    });
});

在上面的例子中,我们模拟了一个NavigationStub类,并使用spyOn()函数来模拟this.router.getCurrentNavigation()方法。这样我们就可以在单元测试中测试我们的组件或服务,而不需要使用Angular提供的路由导航对象。

结论

虽然this.router.getCurrentNavigation()方法非常方便,但在进行功能单元测试时,它可能不是最佳选择。我们可以通过模拟Navigation对象来代替它,以避免异步处理Observable对象带来的单元测试复杂性。