如何模拟 Router 对象并注入 TestBed 配置中的 providers 数组

How to mock a Router object and inject into providers array in TestBed configuration

我正在尝试创建模拟路由器对象并将其注入到 TestBed 配置中,但它不起作用。下面是配置:

let mockQuote: QuoteService = new QuoteService(null, null);
let mockOshcStore: OshcStore = new OshcStore(null);
let mockActivatedRoute: ActivatedRoute = new ActivatedRoute();
let mockRouter: Router = new Router(null, null, null, null, null, null, null, null);
//let mockRouter: RouterMock = new RouterMock();
//let router:Router;
TestBed.configureTestingModule({
  providers: [
    {
      provide: QuoteService, useFactory: () => {
        return mockQuote;
      }
    }, FormBuilder, AppStore,
    {
      provide: OshcStore, useFactory: () => {
        return mockOshcStore;
      }
    },
    {
      provide: ActivatedRoute, useFactory: () => {
        return mockActivatedRoute;
      }
    },
    {
      provide: Router, useFactory: () => {
        return mockRouter;
      }
    },
    HttpClient, QuoteCISLAdapter
  ],
  declarations: [CreateQuoteComponent]
});
fixture = TestBed.createComponent(CreateQuoteComponent);
component = fixture.componentInstance;

以上工作直到 'ActivatedRoute' 但当它到达路线时停止并给出:

TypeError: Cannot read property 'get' of null

  at new Router (../packages/router/src/router.ts:406:30)

我也尝试过使用 'RouterTestingModule' 模块导入数组,但也没有用。想创建一个安全的模拟 Router 对象吗?

我通常在 beforeEach 的顶部有类似上面的内容:

mockActivatedRoute = {
            url: 'test',
            params: of({ paramOne: 1,paramTwo: 2018 })
        };

然后是我的提供商数组中的以下内容:

{ provide: ActivatedRoute, useValue: mockActivatedRoute },

对于路由...这假定您仅在组件中使用导航,如果您使用更多,则需要模拟更多内容:

router = {
            navigate: jasmine.createSpy('navigate')
        };

然后在提供者数组中:

{ provide: Router, useValue: router },