web-dev-qa-db-ja.com

Angularユニットテスト:エラー:どのルートにも一致しません。URLセグメント: 'home / advisor'

私のangular 4.0.0 app)の下で単体テストに取り組んでいますが、私の実際のコンポーネントのいくつかのメソッドは、以下を介して手動ルーティングを呼び出しています:

method(){
....
    this.navigateTo('/home/advisor');
....
}

with navigateToは、これを呼び出すカスタムルーティングメソッドです。

  public navigateTo(url: string) {
    this.oldUrl = this.router.url;
    this.router.navigate([url], { skipLocationChange: true });
  }

私はこのルーティングファイルを持っています:

import ...     // Components and dependencies

const homeRoutes: Routes = [
  {
    path: 'home', component: HomeComponent,
    children: [
      {
        path: 'registration',
        component: RegistrationComponent,
        children: [
          {
            path: 'synthese',
            component: SyntheseComponent
          },
          {
            path: 'queue',
            component: QueueComponent,
            children: [
              {
                path: 'queue-modal',
                component: QueueModalComponent
              },
              {
                path: 'confirm',
                component: ConfirmComponent
              }
            ]
          }
        ]
      },
      {
        path: 'toolbox',
        component: ToolboxComponent
      },
      {
        path: 'appointment',
        component: AppointmentRegistrationComponent
      },
      {
        path: 'appointment-validation',
        component: AppointmentValidationComponent
      },
      {
        path: 'datepicker',
        component: DatePickerComponent
      },
      {
        path: 'validation/:defaultNumber',
        component: ValidationComponent,
        children: [
                   {
                     path: 'synthese',
                     component: SyntheseComponent
                   }
                   ]
      },
      {
        path: 'modalField',
        component: ModalFieldComponent
      },
      {
        path: 'search',
        component: SearchComponent
      },
      {
        path: 'advanced-search',
        component: AdvancedSearchComponent
      },
      {
        path: 'tools',
        component: ToolsComponent
      },
      {
        path: 'advisor',
        component: AdvisorComponent
      },
      {
        path: 'pilote',
        component: PilotComponent
      },
      {
          path: 'blank',
          component: BlankComponent
        },
      {
        path: 'view-360/:id',
        component: View360Component,
        children: [
          {
            path: 'client',
            component: ClientComponent
          },
          {
            path: 'tools',
            component: ToolsAdvisorComponent
          },
          {
            path: 'valid-close',
            component: ValidCloseComponent
          },
          {
            path: 'application',
            component: ApplicationView360Component
          }
        ],
        canActivate: [AuthGuardAdviser]
      },
      {
        path: 'view-360',
        component: View360Component,
        children: [
          {
            path: 'client',
            component: ClientComponent
          }
        ],
        canActivate: [AuthGuardAdviser]
      },
      {
        path: 'contract',
        component: ContractComponent
      },
      {
        path: 'queue-again',
        component: QueueAgainComponent
      },
      {
        path: 'stock',
        component: StockComponent,
        children: [
          {
            path: 'mobile',
            component: MobileComponent
          },
          {
            path: 'stock-level',
            component: StockLevelComponent
          }
        ]
      },
      {
        path: 'usefull-number',
        component: UsefullNumberComponent
      },
      {
        path: 'admin',
        loadChildren: 'app/home/admin/admin.module#AdminModule',
        //           component: AdminComponent,
        canActivate: [AuthGuardAdmin]
      },
      {
        path: 'rb',
        loadChildren: 'app/home/rb/rb.module#RbModule',
        //        component: RbComponent
        //        canActivate: [AuthGuardAdmin]
      },
      {
        path: 'tools-advisor',
        component: ToolsAdvisorComponent
      },
      {
        path: 'catalog/:haveClient',
        component: CatalogComponent
      },
      {
        path: 'application',
        component: ApplicationComponent
      },
    ]
  },

   ];

@NgModule({
  imports: [
    CommonModule,
    RouterModule.forChild(homeRoutes)
  ],
  exports: [
    RouterModule
  ],
  declarations: []
})
export class HomeRoutingModule { }

奇妙なことに、私のアプリケーションでさえ機能的にうまくいきますが、テストでこのエラーがスローされます。

失敗:キャッチされていません(約束どおり):エラー:どのルートにも一致しません。 URLセグメント: 'home/advisor'エラー:どのルートとも一致しません。 URLセグメント: 'home/advisor'

いくつかの構成が不足しているようです。

任意のアイデア??

14
firasKoubaa

私のコメントに続いて:

ルータを単体テストする場合は、実際のモジュールではなく、テストモジュールを使用する必要があります。

皮切りに

import { RouterTestingModule } from '@angular/router/testing';

次に、テストベッドで

imports: [RouterTestingModule]

これで、コンポーネントを単体テストできるはずです

[〜#〜]編集[〜#〜]

あなたのルーティングにスパイを作るには、あなたがしなければならないことは

spyOn(component.router, 'navigate').and.returnValue(true);

そして、あなたは次のようになると期待しています

expect(component.router.navigate).toHaveBeenCalledWith('/home/advisor');
11
user4676340

次のようにRouterTestingModule.withRoutesが必要です:

beforeEach(async(() => {
  TestBed.configureTestingModule({
    imports: [
      RouterTestingModule.withRoutes(
        [{path: 'yourpath', component: BlankComponent}]
      )
    ],
    declarations: [
      BlankComponent,
      YourComponentBeingTested
    ]
  })
  .compileComponents()
}))
2
danday74

コンソールでは、ユニットテストケースの実行中にSubRouteが原因でこのエラーが発生します。単体テストケースに次の方法を実装することで、この問題を修正できます。

class RouterStub {
        url = '';
        navigate(commands: any[], extras?: any) { }
      }

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

同じ問題が発生しました。受け入れられた回答の解決策は私にとってうまくいきません。仕様ファイルにHttpClientTestingModuleではなくHttpClientModuleを誤って追加したためです。 「どのルートにも一致しない」という問題を回避するには、RouterTestingModuleとHttpClientTestingModuleを必要な場所に必ず追加してください。

beforeEach(async(() => {
    TestBed.configureTestingModule({
        imports: [
            RouterTestingModule,
            HttpClientTestingModule,
        ],
        declarations: [
            AppComponent
        ],
    }).compileComponents();
}));
0
monkey-0001